PDPA Security Audit 是一个安全审计技能,用于对任意代码库执行映射到 PDPA 2024(马来西亚)和 OWASP Top 10(2021)的全面安全审计。该技能面向可能没有接受过正式安全培训、但需要交付合规生产代码的开发者。
何时使用
- 上线/生产部署之前
- 当被问及“我的代码安全吗?”时
- 当被问及 PDPA 合规时
- 当被要求执行安全审计时
- 当被问及 OWASP 时
- 在涉及认证、支付或用户数据的大型功能新增之后
审计流程
第一阶段:取证发现检查(PDPA 2024)
对照来自真实马来西亚法院案例的全部 8 项发现检查代码库:
发现 1:SQL 注入 搜索:
- Laravel 中带字符串拼接的 DB::raw()、whereRaw()、orderByRaw()
- Node.js 中 SQL 查询里的模板字面量或字符串拼接
- 任何未使用参数化绑定/预处理语句的查询
- 缺少 ? 占位符或 $1 参数
通过标准:100% 的数据库查询使用参数化绑定。
发现 2:路径遍历 搜索:
- 接受用户可控路径的文件下载端点
- 使用用户输入的 fs.readFile、readFileSync、createReadStream
- 缺少 path.basename() 或路径清理
- 将用户输入与文件系统路径直接拼接
通过标准:服务端代码中无用户可控文件路径,或所有路径均经 basename/白名单清理。
发现 3:竞态条件 搜索:
- 先检查后操作模式(先 SELECT 再 UPDATE/INSERT)
- 缺少幂等保护的支付/webhook 处理器
- 没有原子条件更新的信用/余额操作
- 缺少数据库事务或批量操作
通过标准:所有财务操作使用原子模式(条件 UPDATE、INSERT OR IGNORE + UNIQUE 或数据库事务)。
发现 4:硬编码密钥 搜索:
- 直接写在源代码中的 API 密钥、密码、令牌
- 提交到 git 的 .env 文件
- git 历史中的密钥
- 检查 .gitignore 是否覆盖 .env* 文件
通过标准:源代码中零密钥。所有密钥通过环境变量或密钥管理器提供。
发现 5:审计日志 检查:
- 所有敏感操作的结构化日志
- 所有交易记录的时间戳
- 安全事件日志(认证失败、被拒请求、速率限制)
- 日志持久化(不只是临时的 console.log)
通过标准:所有敏感操作产生带时间戳的可追踪审计条目。
发现 6:上线前测试 检查:
- 测试套件存在且通过
- CI/CD 流水线以测试通过为部署门禁
- 安全专项测试(认证边界、输入验证)
- CI 中的依赖漏洞扫描
通过标准:测试存在、在 CI 中运行,并在失败时阻止部署。
发现 7:依赖安全 检查:
- 可疑或仿冒(typosquatting)的包名
- 来源不明的包
- 缺少锁文件
- 恶意 postinstall 脚本
- 无锁文件的未固定版本
通过标准:所有依赖均为知名包,锁文件存在,无可疑包。
发现 8:许可证合规 检查:
- 未合规即复制到源码中的 GPL 许可代码
- 被移除的版权声明
- 项目存在许可证文件
- node_modules 未被提交
通过标准:项目有许可证,无未合规复制的 GPL 代码,版权声明保留。
第二阶段:OWASP Top 10 评估
对每个类别检查控制措施并识别缺口:
| 类别 | 关键检查 |
|---|---|
| A01 访问控制失效 | 所有受保护路由有认证、RBAC/ABAC、租户范围数据、无 IDOR |
| A02 加密失败 | 强制 HTTPS、密钥仅服务端、静态 PII 加密、时序安全比较 |
| A03 注入 | 参数化查询、模式验证、无命令执行、配置 CSP |
| A04 不安全设计 | 速率限制、幂等性、原子事务、输入验证 |
| A05 安全配置错误 | 安全响应头、无调试模式、净化错误、无 CORS 通配符 |
| A06 易受攻击组件 | 依赖审计通过、锁文件存在、检查仿冒、跟踪已知 CVE |
| A07 认证失败 | 密码哈希、会话管理、防暴力破解、速率限制 |
| A08 数据完整性 | CI 门禁(SAST、密钥扫描)、webhook 签名验证 |
| A09 日志与监控 | 结构化审计日志、防篡改存储、告警 |
| A10 SSRF | 无原始用户可控的服务端 fetch、阻止私有 IP/元数据、重定向验证 |
阶段 2.5:企业修复路由
生成修复清单时,将每项发现映射到对应的专项修复技能:
| 发现 | 路由到 |
|---|---|
| 访问控制失效、IDOR、租户泄漏、管理员暴露 | $access-control-patterns |
| SQL 注入、原始查询、不安全 DB 调用 | $sql-injection-prevention |
| XSS、路径遍历、命令注入、不安全文件上传 | $input-validation |
| 硬编码密钥、提交的 .env、密钥轮换 | $secrets-management |
| 缺少 CSP/HSTS/点击劫持响应头 | $security-headers |
| 弱密码、JWT 误用、会话固定、暴力破解 | $auth-hardening |
| CORS 通配符、凭证泄漏、不安全预检 | $cors-configuration |
| 明文 PII、缺少加密、弱密钥管理 | $data-encryption |
| 堆栈跟踪泄漏、生产环境详细错误 | $error-handling-security |
| 缺少审计追踪或非持久日志 | $audit-logging-workers |
| Webhook 重放、竞态条件、缺少幂等性 | $webhook-security |
| 缺少 SAST、密钥扫描、依赖门禁 | $ci-security-gates |
| 缺少 API 滥用限制或暴力破解限制 | $rate-limiting |
| SSRF、用户可控 URL、元数据端点暴露 | $ssrf-prevention |
| 仿冒、恶意包、缺少锁文件 | $dependency-lockfile-audit |
第三阶段:输出
产出评分卡:
## PDPA Forensic Findings
| # | Finding | Status | Evidence |
|---|---------|--------|----------|
| 1 | SQL Injection | PASS/FAIL | [file:line] |
| 2 | Path Traversal | PASS/FAIL | [file:line] |
| 3 | Race Conditions | PASS/FAIL | [file:line] |
| 4 | Hardcoded Secrets | PASS/FAIL | [file:line] |
| 5 | Audit Logging | PASS/FAIL | [file:line] |
| 6 | Testing | PASS/FAIL | [file:line] |
| 7 | Dependencies | PASS/FAIL | [file:line] |
| 8 | License | PASS/FAIL | [file:line] |
## OWASP Top 10
| Category | Rating | Key Finding |
|----------|--------|-------------|
| A01-A10 | Strong/Good/Weak | ... |
## Priority Fixes
1. [最高风险项优先]
2. ...
法律参考
- PDPA 2010(Pindaan 2024)Seksyen 5(1)(2):Denda sehingga RM1,000,000 atau penjara sehingga 3 tahun
- Akta Hak Cipta 1987 Seksyen 41(1)(i):Denda RM2,000-RM20,000 per fail atau penjara 5 tahun
- Akta Kontrak 1950 Seksyen 74:Ganti rugi am dan khas
- Kanun Keseksaan Seksyen 417/419:Penjara 5-7 tahun(penipuan)
重要说明
- 这是自动化内部评估,不能替代外部渗透测试
- 对于企业/政府合同,应聘请 CREST 认证的外部渗透测试
- 安全是持续维护,不是一次性任务——在重大变更后应重新运行此审计
适用场景
适用于准备上线或生产部署前的代码安全审查、需要了解代码是否安全的场景、PDPA 合规咨询、OWASP 相关审计需求,以及涉及认证、支付或用户数据的大型功能新增之后的安全复查。
限制
资料明确说明这是自动化内部评估,不能替代外部渗透测试;对于企业或政府合同,需另行聘请 CREST 认证的外部渗透测试。该技能需要重新运行,安全被视为持续维护而非一次性任务。