ADR 0011. Báo cáo finding bí mật và dữ liệu cá nhân: giá trị không bao giờ rời máy
- Trạng thái: Đề xuất (mở rộng ADR 0006 cho phần quét nội dung)
- Ngày: 2026-10-02
- Liên quan: ADR 0001, ADR 0006, ADR 0008, ADR 0009, ADR 0010. Câu hỏi Q29, Q30, Q31, Q39, Q41
Bối cảnh
ADR 0006 cam kết chỉ gửi siêu dữ liệu. Phạm vi mới buộc scanner đọc nội dung tệp để tìm bí mật và dữ liệu cá nhân (ADR 0009, ADR 0010). Một hệ thống phát hiện bí mật mà gửi bí mật về trung tâm thì chính nó trở thành nơi rò rỉ lớn nhất: lộ trung tâm là lộ bí mật của mọi khách hàng. Dữ liệu cá nhân gửi đi còn kéo theo nghĩa vụ pháp lý về xử lý và chuyển dữ liệu cá nhân (R19, Q42). Người dùng vẫn cần đủ thông tin để tìm và khắc phục: tệp nào, dòng nào, loại gì, có phải cùng một bí mật lặp lại ở nhiều máy không.
Quyết định
1. Yêu cầu cứng
Giá trị bí mật và dữ liệu nhạy cảm không bao giờ rời máy, dưới bất kỳ dạng nào: không nguyên văn, không cắt ngắn ngoài preview cho phép, không mã hóa thuận nghịch, không băm không khóa, không trong log, thông điệp lỗi, core dump, tệp tạm ngoài thư mục trạng thái, hay đầu ra scan --print. Vi phạm là lỗi chặn phát hành (SNFR-42).
2. Một finding nội dung chỉ mang các trường sau
| Trường | Nội dung | Ghi chú |
|---|---|---|
detector_id, detector_version | Ví dụ AHK-AWS-001, AHP-CCCD-001 | Loại khóa, có mã hóa hay không được mã hóa vào mã detector (ví dụ AHK-PKEY-001 khóa PEM không mã hóa, AHK-PKEY-002 có passphrase), không thêm trường mô tả |
category | secret hoặc sensitive_data | |
path | Đường dẫn tuyệt đối, tối đa 1.024 byte; byte không phải UTF-8 được thoát | Đường dẫn là siêu dữ liệu vận hành (có thể chứa tên người: R11) |
line, column | Bí mật: vị trí lần xuất hiện đầu tiên trong tệp. Dữ liệu cá nhân: dòng đầu tiên có khớp, column bằng 0 | Không gửi danh sách mọi dòng |
preview | Bí mật: tối đa 4 ký tự đầu và 2 ký tự cuối, phần giữa thay bằng ***, chỉ khi giá trị dài từ 16 ký tự; giá trị ngắn hơn, khóa riêng, mật khẩu chung (AHK-ENV-*, AHK-HIST-*) thì rỗng. Dữ liệu cá nhân: luôn rỗng | Q30 |
fingerprint | Xem mục 3 | Dùng để khử trùng, không dò ngược được |
severity | critical, high, medium, low, info, tính trên máy từ detector và mức phơi nhiễm | 14 mục 2 |
first_seen_at, last_seen_at, file_modified_at | Mốc thời gian |
Các trường điều khiển không suy ra được giá trị, đề xuất cho phép (Q29): match_count (số lần khớp trong tệp), confidence (low, medium, high), exposure (owner_only, group_readable, world_readable, web_root, history). Không gửi: đoạn văn bản quanh vị trí khớp, tên khóa cấu hình chứa giá trị, claim của JWT, tên người dùng trong chuỗi kết nối, độ dài chính xác của giá trị, kết quả từng bộ xác thực.
3. Fingerprint có khóa, hai phạm vi
fingerprint = "<phạm vi><phiên bản khóa>:" + hex(HMAC-SHA256(K, detector_family || 0x00 || giá_trị_chuẩn_hóa))| Phạm vi | Khóa K | Dùng cho | Lý do |
|---|---|---|---|
h (máy) | K_host: 32 byte ngẫu nhiên sinh trên máy lúc cài, /var/lib/accesshub-scanner/keys/fp_host.key, chủ accesshub-scanner, 0600. Không bao giờ rời máy | Mọi dữ liệu cá nhân; bí mật entropy thấp (mật khẩu chung, giá trị ngắn hơn 20 ký tự) | Giá trị có không gian nhỏ (số điện thoại khoảng 10^9, CCCD, mật khẩu yếu) dò ngược được trong vài phút nếu khóa nằm ở trung tâm. Với K_host, trung tâm không thể dò |
c (công ty) | K_company: 32 byte do Access Hub sinh cho từng công ty, lưu mã hóa bằng CompanyCrypto (ENC-2), phát xuống máy qua SecurityConfig, lưu trên máy 0600 | Chỉ bí mật entropy cao (dài từ 20 ký tự và đạt ngưỡng entropy của quy tắc, ví dụ khóa AWS, token GitHub) | Cho phép thấy "cùng một khóa có trên 12 máy" trong một công ty. Hai công ty có cùng bí mật cho hai fingerprint không liên quan |
Xoay K_company: tăng phiên bản khóa, scanner tính lại ở lượt nội dung kế tiếp; Access Hub ghép finding cũ và mới theo (server, detector, path) trong thời gian chuyển tiếp. Mất K_host (cài lại máy): fingerprint đổi, finding cũ đóng với lý do fingerprint_reset (không tính là khắc phục).
4. Gom nhóm và giới hạn
- Bí mật: một finding cho mỗi
(detector_id, path, fingerprint);match_countđếm số lần xuất hiện trong tệp. - Dữ liệu cá nhân: một finding cho mỗi
(detector_id, path)(gom theo tệp),match_countlà số bản ghi khớp; mức độ theo số lượng và phơi nhiễm (14mục 5.4). Không tạo finding cho từng số điện thoại. - Mỗi báo cáo tối đa 2.000 finding bí mật và 5.000 finding dữ liệu cá nhân. Vượt thì giữ finding mức cao trước, đặt
findings_truncated, kèm số đếm theo detector cho phần bị cắt.
5. Đường đi và vòng đời
- Lượt nội dung ghi kết quả vào chỉ mục cục bộ (ADR 0009). Báo cáo
SecurityReport(schema_version2) mang ảnh chụp đầy đủ finding nội dung hiện biết của máy, dựng từ chỉ mục, kèmcontent_hashvà thống kê độ phủ. Không đổi thì gửiHASH_ONLYnhư inventory (07). - Access Hub Collector kiểm tra lớp thứ hai: định dạng
detector_id,fingerprint, độ dài và mẫu ký tự củapreview,previewrỗng vớisensitive_data, giới hạn số lượng. Sai thì bỏ finding đó và tăng metric (không bỏ cả báo cáo). - Secmatch giữ trạng thái finding nội dung mới nhất theo
(company_id, server_id), so với lần trước, phát sự kiệnfinding.opened,finding.updated,finding.resolvedvớikindlàsecrethoặcsensitive_datasang Access Hub qua outbox hiện có. Không so khớp DB lỗ hổng cho loại này. - Đóng finding:
content_removed(tệp còn, giá trị không còn),file_deleted,out_of_scope(phạm vi đổi, không tính MTTR),fingerprint_reset. Tệp chưa được quét lại trong baseline không làm đóng finding. finding_key = SHA-256(company_id | server_id | detector_id | path | fingerprint)cho bí mật,SHA-256(company_id | server_id | detector_id | path)cho dữ liệu cá nhân.company_iddo Collector gắn từ token, không lấy từ payload.
6. Hiển thị và quyền trong Access Hub
- Quyền mới theo tenant:
security.secrets.view(xem finding bí mật),security.pii.view(xem finding dữ liệu cá nhân),security.content.manage(phạm vi quét nội dung, gốc tùy chọn, bật dữ liệu cá nhân).security.viewchỉ thấy số đếm của hai loại này. - Thông báo, email, webhook chỉ mang mã detector, mức độ, tên máy, số lượng, liên kết. Không đường dẫn, không preview, không fingerprint.
- Xuất CSV, XLSX: cần quyền tương ứng; mặc định không có cột
preview. - Mở trang chi tiết finding bí mật ghi audit (Q41).
- Khắc phục là tư vấn (ADR 0003): xoay vòng bí mật, gỡ tệp khỏi thư mục web, sửa quyền tệp, xóa dòng lịch sử. Không có nút xóa tệp từ xa.
7. Nền tảng
Chỉ số tổng hợp ẩn danh có ngưỡng k (06 mục 8): số finding theo họ detector, số máy có ít nhất một bí mật mức cao, phân bố theo mức phơi nhiễm. Không đường dẫn, không fingerprint, không preview, không tên công ty, không tên máy.
8. Bộ kiểm thử "không giá trị rời máy"
Cổng phát hành bắt buộc (11 mục 2.1): bộ mẫu chứa giá trị canary có dấu riêng cho mọi detector; chạy scanner thật trên fixture; thu mọi đầu ra (spool, log, stdout, stderr, scan --print, chỉ mục, thông điệp lỗi, payload sau Collector và secmatch, sự kiện gửi Access Hub); khẳng định không xuất hiện canary hay biến thể (base64, hex, URL-encode, đảo chữ hoa thường, cắt dài hơn preview cho phép). Thêm kiểm thử thuộc tính với giá trị ngẫu nhiên, và kiểm thử rằng K_host không xuất hiện ở đâu ngoài tệp khóa.
Hệ quả
- Lộ Collector, secmatch hay Access Hub không làm lộ bí mật hay dữ liệu cá nhân của khách hàng, chỉ lộ vị trí của chúng (vẫn nghiêm trọng: R21, bù bằng quyền tách riêng, audit, không có trong thông báo).
- Người dùng không xem được giá trị từ Access Hub; muốn xác minh phải mở tệp trên máy. Đây là chủ ý.
- Fingerprint của dữ liệu cá nhân chỉ khử trùng trong một máy; "cùng một CCCD xuất hiện trên nhiều máy" là không thể biết (chấp nhận).
- Một bản build scanner độc hại vẫn có thể giấu dữ liệu trong trường fingerprint hoặc đường dẫn (kênh ngầm). Kiểm tra định dạng ở Collector không ngăn được; giảm thiểu bằng chuỗi cung ứng (R17).
- Thêm khóa theo công ty phải quản lý (sinh, mã hóa ENC-2, phát xuống, xoay).
Phương án đã cân nhắc
| Phương án | Lý do không chọn |
|---|---|
| Gửi giá trị mã hóa bằng khóa công ty để người dùng xem trong Access Hub | Trung tâm giữ được khóa giải mã (ENC-2 do Access Hub nắm): lộ trung tâm là lộ bí mật. Trái yêu cầu cứng |
| Băm SHA-256 không khóa | Dò ngược dễ với giá trị không gian nhỏ; so được chéo công ty |
| Một khóa fingerprint toàn nền tảng | Nền tảng dò ngược được và liên kết chéo công ty |
Chỉ K_host cho mọi loại | Mất khả năng phát hiện một bí mật dùng lại trên nhiều máy, là thông tin khắc phục giá trị cao |
| Finding cho từng lần khớp dữ liệu cá nhân | Hàng triệu dòng cho một tệp dump, vô dụng cho người dùng, tăng rủi ro suy luận |
| Gửi đoạn ngữ cảnh đã che | Ngữ cảnh thường chứa chính bí mật khác hoặc dữ liệu cá nhân khác |