# sub-reviewer-5 — CON TRỎ (lane 5: SECURITY + DATA-RISK)

**VERDICT: SUA-TRUOC-THI-CONG** — 3 HIGH / 6 MED / 5 LOW / 1 PASS-dương · 0 anchor sai.

Full-detail nằm ở file cùng thư mục theo tên lane mà spec-task chỉ định:
👉 `.claude/workflows/runs/2026-07-29-S160-khkk-dryrun-plan/sub-reviewer-security-s160.md`

(2 tên file do task-block gọi `sub-reviewer-security-s160.md` còn boilerplate RUN-TRACE gọi `sub-reviewer-5.md`; file này giữ để cả 2 đường trỏ đều tới nội dung, tránh em main đọc hụt.)

## Index 15 finding
| # | SEV | Tóm |
|---|---|---|
| F-S1 | HIGH | W8 seeder-grant dễ thành NO-OP im lặng (row `Contracts` đã tồn tại, nhánh non-Pe = `continue` skip-existing) ⇒ 403 giết dry-run |
| F-S2 | HIGH | 3 handler attachment 0-authz 0-phase-guard (download scan ký/dấu bởi mọi user); W8 cố ý để GET trần; plan §4 chưa khai |
| F-S3 | HIGH | W6 gate 5-anchor thiếu 2/3 call-site `GetEligiblePhases` (`:301` list, `:381` đã-xoá); hàm role-only ⇒ vá rẻ = mở toang |
| F-S4 | HIGH→MED | W6 không có test ÂM cho VIEW; ca ÂM prod không pin ROLE ⇒ 0-bit |
| F-S5 | MED | W8 grant theo ROLE ⟂ V2 duyệt theo USER-ID; 6/13 role ngoài list (gồm HrAdmin/AuthorizedSigner) |
| F-S6 | MED | Map "POST→Create" nuốt comments/attachments/details; test tính-chất không bắt map sai |
| F-S7 | MED | `DeleteContractCommandHandler` 0 owner-check |
| F-S8 | MED | W8 verify bằng `sqlcmd` RDP mâu thuẫn plan §7 (prod verify = curl) |
| F-S9 | MED | W6 nới guard trộn vế hẹp (`CreatedBy`) + vế rộng (`Procurement`); tên field lệch `DrafterUserId` |
| F-S10 | MED-LOW | `FormsController:11` class-trần, 0 policy per-action — hố chưa khai |
| F-S11 | LOW | Guard `>= DangInKy` chặn cả ChoDuyet/TraLai/TuChoi, plan chỉ khai DaPhatHanh |
| F-S12 | LOW | Q11 2-đường-song-song ⇒ dry-run không chứng minh được cổng KHKK giữ |
| F-S13 | PASS+INFO | 0 mật khẩu trong plan/spec/sub-file; INFO: `Admin@123456` ở 25 file tracked khác |
| F-S14 | PASS | "22 endpoint ghi" đúng; O-B/O-C phân vai đúng; revoker S92 không xung đột |
| F-S15 | LOW | Nhãn đo `plan §3` "curl 6 phase" dưới-phủ enum 12 giá trị (vật chịu lực là "tổng") |
