AuditCore is built on the same compliance framework it audits. This page documents our security posture, data handling practices, and regulatory compliance — so you can evaluate us the same way we evaluate your systems.
Every check below ran against this product’s source code on the date shown. We publish the failures too — a compliance vendor that only shows you its passes is showing you a brochure, not an audit. Check counts rose in August because each framework gained implementation-level companions: checks that read code and configuration rather than documents.
| Framework | Checks | Our result | Key obligations covered |
|---|---|---|---|
| PDPA Malaysia 2024 | 44 | 41 pass · 3 warn | Processor liability (s.9), 72-hr notification (s.12B), data minimisation, DPA, cross-border transfers, data subject rights, PII pattern detection, granular consent schema, residency declaration |
| NAIO AI Governance 2026 | 23 | 21 pass · 2 warn | AI governance disclosure, explainability mechanism, risk classification, hallucination logging, bias assessment, model card, AI incident reporting, decision log, human review route |
| Cyber Security Act 854 | 27 | 26 pass · 1 warn | Incident response plan, SIEM monitoring, BCP/DRP, NACSA reporting, VAPT schedule, RBAC, supply chain assessment, backup procedure, CISO designated, tamper-evident audit trail |
| OWASP Top 10 | 4 | 1 pass · 3 warn | Parameterised queries, no hardcoded secrets, HTTPS enforced, pinned dependencies |
| CIS Controls v8 | 4 | 4 / 4 pass | MFA policy documented, MFA implemented in code, patch management documented |
Full disclosure of every non-passing finding from the run above.
| Finding | Our assessment | Status |
|---|---|---|
| Personal data in an application log PDPA-PII-04 | Genuine — now fixed. Seven lines of a local diagnostic log contained customer email addresses. The file was local to the host and excluded from version control, so nothing was published or transmitted — but writing personal data to logs is a data-minimisation failure regardless. We now redact personal data at the output boundary, so every log line from every service is filtered before it is written. The historical entries were redacted in place, and logs are purged on a retention cycle. | Fixed — verified 23 July 2026 |
| SQL injection risk OWASP-A03-B01 | False positive — check rebuilt. The old check flagged any formatted string inside a database call. It now parses the code and separates an interpolated value (injectable) from an interpolated identifier such as a column name, which SQL cannot parameterise. Our four sites are all identifiers, so they are reported as a warning for review rather than a block. Real injections still block — we keep regression tests covering five different injection forms. | Fixed — verified 23 July 2026 |
| Identity-number values in source PDPA-PII-01 | False positive. The matches are the example patterns inside our own detection rules and their documentation — the scanner recognising its own rulebook. | Fixed — verified 23 July 2026 |
| Prohibited AI practice indicators NAIO-B03 | False positive. Same cause: the terms this check searches for are listed in the check’s own definition and in our product documentation. | Fixed — verified 23 July 2026 |
| Unpinned dependency versions OWASP-A06-W02 | Genuine — now fixed. Twelve of thirteen dependencies were specified as minimum versions rather than exact ones, while this page claimed otherwise. They are pinned to the versions the images were built and tested against. | Fixed — verified 1 August 2026 |
| Ten documented controls not implemented implementation companions | Genuine — all ten now built. Our own implementation checks found that we documented controls we had not built. Shipped on 2 August 2026: a hash-chained audit trail where editing any past entry breaks every link after it, per-purpose consent that pins the version of the terms in force when it was given, a machine-readable data-residency declaration, and a human-review route that can uphold or overturn any automated decision. Closed 18 August 2026: log forwarding was built but shipped disabled, because there was no collector to ship to and our check rightly refuses to credit a capability nobody switched on. We built the collector — a process beside the app with no credentials, no published port, and a log directory the application containers cannot mount, so reaching the API no longer means being able to erase the evidence of it. Forwarding also had to be widened to carry what this codebase actually writes: it was attached to the logging framework, and almost everything here is print(), so the control had been shipping a fraction of the record it claimed to preserve. | All ten — nine verified 2 August 2026, the last 18 August 2026 |
| Seven gaps found by round two — one real, four check faults, two closed PDPA-2024-W14/W15/W16, ACT854-W17/W18/W20, NAIO-W11 | One control built; four of our own checks were wrong. Genuine, and fixed: data subject rights. You can now download everything we hold about you as a machine-readable file, correct your email, or erase your account — a company selling PDPA compliance had been holding customer personal data with no way for the subject to see it, correct it or remove it. Erasure re-authenticates and reports exactly what it deleted and what it retained; your security audit entries survive under Cyber Security Act 2024 s.29 and identify nobody, because that log never stores an email. Four were our checks failing, not our controls: a word-boundary fault meant networks: in a Docker Compose file could never match, so segmentation read as absent on every compose file we have ever scanned; the model card check excluded docs/, the folder model cards live in; the access control check did not know FastAPI’s scope-based authorisation, and a lookbehind refused any private helper, which blinded seventeen patterns at once; and the cookie consent check asked for a banner from a site with no tracking cookie, which would have been theatre. One was undeclared rather than absent: our audit chain is append-only and never purged, which exceeds the three years Act 854 asks for — we had simply never written the figure down. We found these because we run the scanner on ourselves and publish what it says. | Resolved — verified 4 August 2026 |
| Malaysian phone numbers in source PDPA-PII-03 | False positive. The matches are our own published business number in email footers — a company contact line, not anyone’s personal data. | Reviewed — 2 August 2026 |
| Credential-shaped value in a test file OWASP-A02-B02 | False positive. A throwaway password generated at run time inside a test, not a stored credential. The check reports it as a warning rather than hiding it, because a credential in test code is still a credential worth a human glance. | Reviewed — 2 August 2026 |
| Plain HTTP URL OWASP-A05-W01 | False positive. Both matches are internal: the container-to-host loopback address, and a private LAN address inside a remediation instruction. Neither leaves the machine. | Reviewed — 2 August 2026 |
Why we publish this. A perfect score on a vendor’s own trust page tells you nothing. Every claim on this page is one we expect you to test: our checks have limits, our code has findings, and both are written down. If you want the same treatment for your own systems, the free check starts there.
A scanner that cries wolf is as useless as one that stays silent. In July 2026 our own audit produced three blocking findings that were wrong — our detection rules had matched the example patterns inside our own rulebook. A customer whose codebase is security tooling, or whose policy documents quote regulatory terminology, would have hit exactly the same thing.
So every detection finding now carries a strength, and we weakened the findings rather than deleting them:
| Strength | What it means | Effect |
|---|---|---|
| High | The evidence was found in executable code or live configuration. | Blocks, as before |
| Low | The evidence was found in a rule definition, a test fixture, or prose — usually the pattern being described rather than a defect. | Reported as a warning, never hidden |
Two principles govern this. A silenced true positive is worse than a noisy false one, so nothing is ever suppressed — low-strength findings still appear in your report, labelled, for you to judge. And the SQL injection check now parses your code rather than pattern-matching it, so an interpolated value (injectable) is separated from an interpolated column name (not). We keep regression tests proving that real injections, real identity numbers, and real prohibited practices still block — because “fewer false positives” must never quietly become “less detection”.
Fixing this also exposed a bug worth admitting: one prohibited-practice rule could never match the very term it named, so it would have missed a real violation. The regression tests caught it. It is fixed.
Not every compliance check can prove the same thing, and we label which is which. Every finding AuditCore reports carries a verification depth:
| Depth | What a pass proves | Share of our 222 checks |
|---|---|---|
| Implementation | The control was found operating in code or configuration. | 48 |
| Detection | A scan for a specific defect found none present. | 23 |
| Documentation | The practice is documented — evidence of policy, not proof of operation. | 151 |
Most compliance obligations are policy obligations, so documentation depth is the honest answer for most checks — but you should know which is which, and a report that blurs the two is worth less than one that does not. In July 2026 we reviewed all 178 of our own checks and relabelled every title that claimed more than it proved.
AuditCore applies data minimisation — we collect only what is necessary to deliver the service (PDPA 2010 s.6).
| Data | Held by AuditCore | Retention |
|---|---|---|
| Email address | Yes — stored for sign-in and report delivery | Duration of account + 12 months |
| Password | bcrypt hash only — never plaintext | Duration of account |
| Scan results | Yes — your job results and report | 90 days, then auto-purged · verified Jul 2026 |
| Billing status | Stripe customer ID + plan only | 7 years (tax law) |
| Payment card | No — Stripe handles all card data | n/a |
| IP address | Server logs only — security & abuse prevention | Rotating logs, short-term |
| Codebase content | Processed only for the duration of the scan | Deleted on scan completion |
We use a small, fixed set of sub-processors. Each has been security-assessed under Act 854 s.33.
| Sub-processor | Purpose | Data shared | Certification | Location |
|---|---|---|---|---|
| Stripe Inc. | Payment processing | Billing data (Stripe direct — no card data via us) | PCI-DSS Level 1 | USA |
| Cloudflare Inc. | Network / tunnel / CDN | Network metadata only | ISO 27001 | USA |
| Qdrant (self-hosted) | Vector database | Regulatory corpus only — no personal data | Self-hosted | Malaysia |
| Ollama (self-hosted) | Embedding model | Regulatory query text only | Self-hosted | Malaysia |
Sub-processor list last reviewed: June 2026. We will notify customers of any material changes.
| Data type | Stored in | Notes |
|---|---|---|
| Customer accounts, scan results | Malaysia (local server) | Primary SQLite databases on TechnoNet infrastructure |
| Regulatory corpus (Qdrant) | Malaysia (local server) | Self-hosted vector database |
| Billing records | USA (Stripe) | PCI-DSS L1 · governed by Stripe DPA · PDPA s.129 compliant |
Cross-border transfers to Stripe are governed by standard contractual clauses and comply with PDPA 2010 s.129. All AI inference runs on-premises — no data leaves Malaysia for AI processing.
Under the PDPA s.9 (as amended in 2024), TechnoNet Sdn Bhd is directly liable as a data processor for personal data in its custody — fine up to RM 1,000,000 for breaches.
Our commitments to you:
Full Privacy Policy → · Request DPA →
AuditCore delivers Compliance Visibility — a scored report on every technical gap between your files and your stated policy. Your legal team determines whether that discrepancy constitutes a PDPA violation or regulatory non-compliance. AuditCore scan results are informational only and do not constitute legal advice.
Auditor-in-the-Loop: AuditCore generates the artefacts — scored findings, remediation guidance, and compliance assessment reports. The client's compliance officer is the human who reviews those artefacts and determines what action to take. TechnoNet Sdn Bhd accepts no liability for decisions made on the basis of AuditCore output without appropriate legal review.