ADR 0007Chấp nhận
ADR 0007. Engine so khớp mỏng tự viết, nguồn dữ liệu cắm được, công cụ mã nguồn mở chỉ làm chuẩn đối chiếu
- Trạng thái: Chấp nhận (2026-10-02, chủ dự án duyệt Q5) có sửa đổi: bộ so khớp được thiết kế với nguồn dữ liệu cắm được để thêm nhiều nguồn và đối chiếu song song (điểm 4 đến 8 dưới đây).
- Bằng chứng: engine Go tĩnh không CGO đã cài (
internal/dpkgver,internal/secmatch); so sánh phiên bản khớpdpkg --compare-versionstrên 13.867 cặp; S3: trùng Trivy và Grype về phiên bản sửa trên mọi finding có bản sửa, recall 99,9% so với hợp hai công cụ; Trivy và Grype chỉ dùng ngoài sản phẩm làm chuẩn đối chiếu (tools/accuracy) - Ngày: 2026-10-02
Bối cảnh
Có các công cụ quét mã nguồn mở trưởng thành: Trivy (Apache-2.0), Grype (Apache-2.0), OpenSCAP (LGPL-2.1, thư viện C), Vuls (GPL-3.0). Sản phẩm có ràng buộc: binary tĩnh không CGO (ADR 0001 của Access Hub Agent), so khớp tập trung (ADR 0002), DB có chữ ký do nền tảng dựng (ADR 0005), gói Dedicated phân phối on-prem cho khách hàng.
Quyết định
- Tự viết phần lõi: parser DB gói trên máy, so sánh phiên bản dpkg, rpm, apk, ánh xạ dữ liệu distro sang lược đồ secdb, thuật toán so khớp, chấm điểm.
- Dùng lại thư viện nhỏ, giấy phép dễ dãi cho phần định dạng phức tạp (ứng viên đọc rpmdb), sau khi xem xét giấy phép, kích thước, bảo trì ở P0.
- Trivy, Grype, OpenSCAP, Vuls chỉ chạy trong môi trường kiểm thử làm chuẩn đối chiếu độ chính xác (
11mục 3), không nhúng, không phân phối. - Nguồn cắm được: mỗi nguồn là một adapter trong
secdb-build(giao diệnSource: tải tăng dần, chuẩn hóa, thống kê) sinh bản ghi advisory theo nguồn đã chuẩn hóa:(source, ecosystem, package, vuln_id, status, fixed_version, channel, severity, advisory_ids, source_record_id, published_at, modified_at, first_seen_at). Bản ghi của các nguồn không ghi đè nhau khi dựng; thêm nguồn mới không đổi bộ so khớp. - Chính sách ưu tiên theo distro (cấu hình đã ký trong secdb, ví dụ
ubuntu: [ubuntu-osv, ubuntu-oval],debian (đang hỗ trợ): [debian-tracker, osv-debian],debian (hết hỗ trợ): [debian-elts-tracker, osv-debian]) chọn nguồn quyết định cho mỗi(ecosystem, package, vuln_id). - Nhanh nhất thắng, nguồn khác xác nhận: khi một nguồn chính thống trong danh sách của distro có bản ghi mới hoặc thay đổi mà nguồn ưu tiên cao hơn chưa có, bản ghi đó được dùng ngay với cờ
unconfirmed; khi nguồn ưu tiên cao hơn có bản ghi, nó quyết định và cờ chuyển thành đồng ý hoặc không đồng ý. Nguồn chỉ làm giàu (NVD, KEV, EPSS, CVE List) không bao giờ quyết định trạng thái gói OS (ADR 0004). - Nguồn gốc trên mọi finding:
decided_by(nguồn quyết định),confirmed_by[],disputed_by[](nguồn có kết luận khác: trạng thái hoặc phiên bản sửa khác),sources_agree(bool),unconfirmed(bool). secdb mang đủ bản ghi theo nguồn để secmatch tính các trường này lúc so khớp. - Đối chiếu là chỉ số chất lượng: secdb-build xuất tỉ lệ đồng ý giữa các nguồn theo distro và độ trễ theo nguồn; tỉ lệ đồng ý giảm đột ngột chặn phát hành chờ duyệt (như kiểm tra số bản ghi giảm, ADR 0005 điểm 5).
Hệ quả
- Kiểm soát hoàn toàn độ chính xác, lược đồ DB, nhịp phát hành, giấy phép.
- Công sức ban đầu lớn hơn (đã tính trong
12), rủi ro độ chính xác giảm bằng benchmark liên tục. - Không phụ thuộc lịch phát hành hay điều khoản DB của bên thứ ba.
- Lược đồ secdb cần thêm bản ghi theo nguồn và chính sách ưu tiên (secdb v2,
SDB-2); bản P1 hiện tại (một bản ghi đã gộp mỗi khóa, trườngsource) là trường hợp riêng một nguồn mỗi distro và tiếp tục chạy cho tới khiSDB-2xong. - Kích thước DB tăng theo số nguồn (ước tính thêm 30 đến 60% với hai nguồn mỗi distro); bộ nhớ secmatch tăng tương ứng nhưng vẫn trong ngân sách nhờ chỉ mục gọn.
- Access Hub hiển thị nguồn gốc và cờ đồng ý trên chi tiết finding (
08mục 11, phần P3).
Phương án đã cân nhắc
| Phương án | Lý do không chọn |
|---|---|
| Nhúng Trivy hoặc Grype làm thư viện trong secmatch | Giấy phép mã dùng được (giữ NOTICE), nhưng gắn với lược đồ và cách phát hành DB của bên thứ ba (điều khoản thương mại của DB do bên đó phát hành: cần kiểm chứng), API thư viện không cam kết ổn định, khó tách phần so khớp khỏi phần quét trên máy, khó dựng DB ký số của riêng mình. Có thể xem lại nếu P1 trễ nặng (Q5) |
| OpenSCAP | Thư viện C cần CGO, trái binary tĩnh; LGPL đòi cho phép người dùng thay thư viện; mạnh ở kiểm tra cấu hình theo SCAP nhưng nặng |
| Vuls | GPL-3.0: phân phối trong gói Dedicated kéo theo nghĩa vụ mở mã phần kết hợp |