OWASP Top 10:2025 — tổng quan, phương pháp xếp hạng và bảng đối chiếu 2021 → 2025

Series OWASP Top 10:2025: Bài 0 — tổng quan (bài này) · Tiếp: Bài 1 — A01 Broken Access Control →

Câu mở màn quen thuộc của vòng phỏng vấn bảo mật cho Senior Backend / Tech Lead là "Anh kể tên OWASP Top 10 xem". Kể đủ mười cái tên thì ai cũng học thuộc được; thứ interviewer thật sự nghe là câu tiếp theo: danh sách này được làm ra thế nào, nó không phải là cái gì, bản 2025 đổi gì so với 2021 và vì sao, và trong team của anh nó được dùng ở bước nào của quy trình. Bài 0 là bản đồ của cả series: đọc xong bài này thì mỗi bài A01–A10 phía sau chỉ còn là đi sâu vào một ô trên bản đồ.

Vì sao bài này không theo khung 9 câu hỏi của CLAUDE.md, và vì sao không có lab. Bài về một danh sách rủi ro, không phải một công nghệ, nên dùng khung riêng của series (đã thống nhất trước). Đây là bài tổng quan: nó không khẳng định một kiểu tấn công nào "chạy được" hay một cách vá nào "chặn được". Các bài A01–A10 của series cũng không có lab (quyết định của series): chúng dựa trên tài liệu chính thức (OWASP, docs Laravel/NestJS) và ghi "chưa verify" ở chỗ cần lab mới khẳng định được. Mọi con số OWASP ở đây chép từ các trang chính thức top10.owasp.org/2025/en/ (Introduction, What are Application Security Risks, Establishing a Modern AppSec Program, Next Steps, và 10 trang A01–A10), đọc ngày 27/10/2026. Phép tính lại Risk Score ở mục 2.4 là số học trên bảng OWASP công bố (Python 3.14), không phải lab. Chỗ nào nguồn tự mâu thuẫn hoặc chỉ có nguồn thứ cấp thì ghi ở mục "Chưa verify".

1. OWASP Top 10 là gì — và không phải là gì

1.1 Là một awareness document, không phải một standard

1. Trang chủ bản 2025 tự định nghĩa: "The OWASP Top 10 is a standard awareness document for developers and web application security. It represents a broad consensus about the most critical security risks to web applications." Từ khoá là awareness document (tài liệu nâng cao nhận thức): mục tiêu là để một developer chưa từng học bảo mật biết mười nhóm rủi ro phổ biến và nguy hiểm nhất tồn tại, chứ không phải để làm danh sách kiểm tra "đạt/không đạt". Bản 2025 là "the 8th installment" (bản thứ 8) theo trang Introduction; trang về chương trình AppSec nói danh sách tồn tại "since its inception in 2003".

2. Chính OWASP nói thẳng ở trang "Establishing a Modern Application Security Program": "The OWASP Top 10 is primarily an awareness document. However, this has not stopped organizations from using it as a de facto industry AppSec standard since its inception in 2003. If you want to use the OWASP Top 10 as a coding or testing standard, know that it is the bare minimum and just a starting point." Tức là: dùng nó làm chuẩn thì được, nhưng phải hiểu đó là mức sàn (bare minimum), không phải mức đủ.

3. Lý do kỹ thuật khiến nó không làm standard tốt được: Top 10 mô tả rủi ro, không mô tả yêu cầu kiểm chứng được. OWASP lấy ví dụ: A06:2025 Insecure Design "is beyond the scope of most forms of testing"; còn việc logging/monitoring có thật sự hoạt động hay không "can only be done with interviews and requesting a sampling of effective incident responses". Một static analysis tool có thể thấy "thiếu dòng log", nhưng không thể biết business logic có log lại một vụ vượt quyền hay không. Kết luận của OWASP rất mạnh: "OWASP discourages any claims of full coverage of the OWASP Top 10, because it's simply untrue." — vendor nào quảng cáo "tool của chúng tôi phủ 100% OWASP Top 10" là đang nói điều OWASP bác bỏ.

4. Hệ quả thực tế: khi cần một standard (bộ yêu cầu có thể nghiệm thu), OWASP chỉ sang ASVS (Application Security Verification Standard — bộ yêu cầu kiểm chứng bảo mật ứng dụng), và nói rõ "The ASVS is the only acceptable choice for tool vendors." Bảng khuyến nghị của OWASP (chép nguyên):

Use caseOWASP Top 10 2025OWASP ASVS
AwarenessYes
TrainingEntry levelComprehensive
Design and architectureOccasionallyYes
Coding standardBare minimumYes
Secure Code reviewBare minimumYes
Peer review checklistBare minimumYes
Unit testingOccasionallyYes
Integration testingOccasionallyYes
Penetration testingBare minimumYes
Tool supportBare minimumYes
Secure Supply ChainOccasionallyYes

1.2 Đặt cạnh các danh sách "họ hàng"

Interviewer hay hỏi nối: "Thế còn ASVS, CWE Top 25, API Top 10 thì khác gì?". Điểm mấu chốt để phân biệt là trả lời hai câu: đơn vị của danh sách là gì (nhóm rủi ro, yêu cầu, hay một điểm yếu cụ thể) và phạm vi là hệ thống loại nào (web app, API, mobile, ứng dụng LLM).

Tài liệuĐơn vịPhạm viDùng đểGhi chú quan trọng
OWASP Top 10:202510 category, mỗi category gom 5–40 CWEWeb applicationNhận thức, đào tạo nhập môn, mức sàn cho reviewXếp hạng theo dữ liệu + survey; không kiểm chứng được trọn vẹn bằng tool
OWASP ASVS 5.0.0 (phát hành 30/05/2025)Từng requirement kiểm chứng được, chia 3 levelWeb app và web serviceSecurity requirement khi thiết kế, tiêu chí nghiệm thu, hợp đồng outsourceL1 ≈ 20% requirement; L1+L2 ≈ 70%; L3 là ~30% còn lại (mục 5.4)
OWASP MASVSNhóm control MASVS-STORAGE, -CRYPTO, -AUTH, -NETWORK, -PLATFORM, -CODE, -RESILIENCE, -PRIVACYMobile appChuẩn bảo mật app mobile, đi kèm MASTG (hướng dẫn test)Tự gọi mình là "the industry standard for mobile app security"
CWE Top 25 (MITRE, bản 2025)25 CWE riêng lẻMọi loại phần mềm (kể cả C/C++)Ưu tiên điểm yếu cụ thể cho tool, cho đào tạo theo ngôn ngữBản 2025: #1 CWE-79 XSS, #2 CWE-89 SQL Injection, #3 CWE-352 CSRF, #4 CWE-862 Missing Authorization; có cả out-of-bounds write, use-after-free — thứ ít gặp ở PHP/Node
OWASP API Security Top 10 – 202310 rủi ro riêng cho APIREST/GraphQL APIReview API, đặc biệt authorization ở mức object/propertyAPI1 Broken Object Level Authorization, API3 gộp Excessive Data Exposure + Mass Assignment, API4 Unrestricted Resource Consumption, API7 SSRF
OWASP Top 10 for LLM Applications 202510 rủi ro của ứng dụng LLM / GenAIApp gọi LLM, agent, RAGThiết kế tính năng AILLM01 Prompt Injection … LLM10 Unbounded Consumption; chi tiết ở bài bảo mật agent

5. Vì sao OWASP không làm "Top 10 CWE" cho gọn như MITRE? Trang Introduction trả lời hai lý do: (a) không phải CWE nào cũng tồn tại trong mọi ngôn ngữ/framework, nên một danh sách 10 CWE sẽ có phần "không áp dụng" với nhiều team; (b) cùng một lỗ hổng phổ biến có nhiều CWE khác nhau (Injection, Command Injection, XSS, hardcoded password…), và mỗi tổ chức/tester gán CWE một kiểu — gom vào category giúp "raise the baseline and awareness of the different types of weaknesses that may occur under a common category name". Đổi lại, category rộng thì mơ hồ hơn khi dùng để đo: "app có lỗi A06" không cho biết sửa cái gì.

1.3 Trade-off: dùng như checklist hay dùng như bản đồ nhận thức

6. Dùng như checklist (vd mục "đã kiểm tra OWASP Top 10" trong MR template). Được: rẻ, ai cũng hiểu, ép người review ít nhất nghĩ tới mười hướng. Mất: cảm giác an toàn giả — mười ô đều tick nhưng những thứ không nằm trong danh sách (race condition trong nghiệp vụ, rủi ro đặc thù domain) bị bỏ qua; và vì mỗi category gom hàng chục CWE, một dòng "A05 Injection: OK" không nói người review đã kiểm tra những gì. Kiểu dùng này hợp với team nhỏ chưa có chương trình AppSec, như bước đầu tiên.

7. Dùng như bản đồ nhận thức (awareness). Được: đúng mục đích OWASP đặt ra, dùng để đào tạo, để định hướng threat modeling, để chọn nơi đầu tư tool. Mất: không đo được, không nghiệm thu được. Muốn đo thì phải đi xuống ASVS (requirement cụ thể, có level) — đó là chỗ một Tech Lead nên đưa team tới khi sản phẩm có dữ liệu nhạy cảm hoặc có khách hàng đòi bằng chứng bảo mật.

8. Cách dung hoà hay gặp trong thực tế (tổng hợp từ khuyến nghị của OWASP, không phải "một đáp án chuẩn"): Top 10 làm ngôn ngữ chung và chương trình đào tạo; ASVS (thường là L1 hoặc một bản fork rút gọn của L2) làm requirement; tool trong CI phủ phần tự động hoá được; threat modeling và code review phủ phần không tool nào phủ (A06, logic của A01, hiệu lực của A09).

2. Phương pháp 2025: dữ liệu đến từ đâu, xếp hạng thế nào

2.1 Dữ liệu: đo "tỉ lệ ứng dụng có lỗi", không đo "số lỗi"

1. OWASP xin dữ liệu từ các công ty test bảo mật (SAST/DAST vendor, bug bounty, consultancy). Danh sách đóng góp gồm Accenture (Prague), Bugcrowd, Contrast Security, CryptoNet Labs, Intuitor SoftTech Services, Orca Security, Probely, Semgrep, Sonar, usd AG, Veracode, Wallarm và nhiều đơn vị ẩn danh — tổng cộng dữ liệu của "over 2.8 millions applications".

2. Câu hỏi gửi đi là: mỗi năm (từ 2021) test bao nhiêu ứng dụng, và bao nhiêu ứng dụng có ít nhất một instance của từng CWE. OWASP cố ý bỏ qua frequency (tần suất): "Whether an application has four instances of a CWE or 4,000 instances is not part of the calculation". Lý do: tester thủ công thường ghi một lỗ hổng một lần dù nó lặp lại khắp app, còn tool tự động ghi từng instance — nếu đếm instance thì dữ liệu của tool tự động sẽ đè bẹp dữ liệu thủ công.

3. Ví dụ minh hoạ (số giả định): vendor X test 1.000 app, trong đó 37 app có ít nhất một chỗ thiếu kiểm tra quyền (CWE-862), một app trong số đó có 4.000 endpoint thiếu kiểm tra. Incidence rate của CWE-862 tại vendor X năm đó là 37 / 1.000 = 3,7% — app có 4.000 chỗ vẫn chỉ tính là một.

4. Hai chỉ số đi kèm, định nghĩa theo trang "What are Application Security Risks?": Incidence Rate = phần trăm ứng dụng mắc CWE đó trong số ứng dụng tổ chức đó test trong năm; Coverage (độ phủ test) = phần trăm ứng dụng được test cho CWE đó trên tổng số ứng dụng của mọi tổ chức. Coverage càng cao thì incidence rate càng đáng tin, vì mẫu đại diện hơn. Đây là chỗ hay bị hiểu nhầm: incidence thấp có thể chỉ vì ít ai test được loại lỗi đó (A03, A09 là ví dụ điển hình).

5. Quy mô dữ liệu CWE tăng mạnh qua các bản: "We went from approximately 30 CWEs in 2017, to almost 400 CWEs in 2021, to 589 CWEs in this edition". Sau khi gom, 10 category của 2025 chứa 248 CWE (theo Introduction), trung bình 25 CWE/category, thấp nhất 5 (A03, A09), cao nhất 40 (A01), và OWASP tự đặt trần 40 CWE/category. Từ điển CWE của MITRE lúc phát hành có 968 CWE.

2.2 Nửa còn lại của phương trình rủi ro: Exploit và Impact từ CVE

6. Tần suất chỉ là một nửa rủi ro. Nửa kia — khai thác dễ không, hậu quả lớn không — OWASP lấy từ CVE: tải OWASP Dependency Check, trích điểm CVSS Exploit và Impact, nhóm theo CWE gắn với CVE. Số liệu 2025: khoảng 175k bản ghi CVE → CWE trong NVD (2021 là 125k), 643 CWE duy nhất có gắn CVE (2021 là 241); trong gần 220k CVE trích ra có 160k điểm CVSS v2, 156k điểm v3 và 6k điểm v4 (một CVE có thể có nhiều điểm nên tổng vượt 220k).

7. Điểm được trộn theo tỉ trọng: nhóm CVE theo CWE, trung bình điểm Exploit và Impact có trọng số theo tỉ lệ CVE có CVSSv3 và phần còn lại chỉ có CVSSv2. Vì sao không dùng CVSS v4.0? Vì thuật toán v4 "no longer easily provides the Exploit or Impact scores as CVSS v2 and CVSSv3 do" — OWASP chưa tìm được cách quy đổi kịp cho bản 2025.

2.3 Công thức Risk Score

8. Trang "What are Application Security Risks?" công bố công thức (giống 2021, đổi trọng số):

Risk Score = (Max Incidence Rate % × 1000)
           + (Max Coverage % × 100)
           + (Avg Exploit × 10)
           + (Avg Impact × 20)
           + (Sum Occurrences / 10000)
Cách nói khi phỏng vấn: "Điểm rủi ro của mỗi nhóm là tổng năm phần. Phần nặng nhất là tỉ lệ ứng dụng mắc lỗi ở mức cao nhất trong nhóm — cứ thêm một phần trăm ứng dụng mắc lỗi là cộng mười điểm. Sau đó là độ phủ test, độ dễ khai thác và mức tác động lấy từ điểm CVSS của các CVE liên quan, trong đó tác động được nhân đôi trọng số so với khai thác. Cuối cùng cộng thêm một chút theo tổng số ứng dụng mắc lỗi, cứ mười nghìn ứng dụng là một điểm. Nên nhóm nào vừa phổ biến vừa được test rộng sẽ lên đầu, còn nhóm khó test thì gần như không thể leo lên bằng dữ liệu."

9. Trọng số nói lên điều gì? Max Incidence là một phần (vd 0,2015 cho 20,15%) nhân 1000, nên 1 điểm phần trăm = 10 điểm. Max Coverage 100% chỉ cho tối đa 100 điểm. Exploit (thang 10) × 10 → tối đa 100; Impact × 20 → tối đa 200. Occurrences: 100.000 ứng dụng = 10 điểm. OWASP công bố dải điểm thực tế: "The calculated scores ranged from 621.60 for the category of Broken Access Control to 271.08 for Memory Management Errors."

2.4 Thử tính lại từ bảng công bố — và vì sao đừng nói "thứ hạng do công thức quyết định"

10. Mỗi trang A01–A10 và trang Next Steps có một "Score table" (CWEs Mapped, Max/Avg Incidence, Max/Avg Coverage, Avg Weighted Exploit/Impact, Total Occurrences, Total CVEs). Ghép các cột đó vào công thức trên bằng Python để xem thứ hạng có tái tạo được không:

# risk_score.py — số liệu chép từ Score table của từng trang top10.owasp.org/2025/en/A0x_… và X01_2025-Next_Steps
rows = {  # max_incidence, max_coverage, avg_exploit, avg_impact, total_occurrences
    "A01 Broken Access Control":        (0.2015, 1.0000, 7.04, 3.84, 1_839_701),
    "A02 Security Misconfiguration":    (0.2770, 1.0000, 7.96, 3.97,   719_084),
    "A03 Software Supply Chain":        (0.0956, 0.6542, 8.17, 5.23,   215_248),
    "A04 Cryptographic Failures":       (0.1377, 1.0000, 7.23, 3.90, 1_665_348),
    "A05 Injection":                    (0.1377, 1.0000, 7.15, 4.32, 1_404_249),
    "A06 Insecure Design":              (0.2218, 0.8876, 6.96, 4.05,   729_882),
    "A07 Authentication Failures":      (0.1580, 1.0000, 7.69, 4.44, 1_120_673),
    "A08 Software/Data Integrity":      (0.0898, 0.7852, 7.11, 4.79,   501_327),
    "A09 Logging & Alerting":           (0.1133, 0.8596, 7.19, 2.65,   260_288),
    "A10 Exceptional Conditions":       (0.2067, 1.0000, 7.11, 3.81,   769_581),
    "X01 Lack of App Resilience":       (0.2005, 0.8601, 7.92, 3.49,   865_066),
    "X02 Memory Management Failures":   (0.0296, 0.5562, 6.75, 4.82,   220_414),
}
def score(mi, mc, ex, im, occ):
    return mi * 1000 + mc * 100 + ex * 10 + im * 20 + occ / 10000
for name, r in sorted(rows.items(), key=lambda kv: -score(*kv[1])):
    print(f"{name:32s} {score(*r):7.2f}")

$ python3 risk_score.py        # Python 3.14.7
A01 Broken Access Control         632.67
A02 Security Misconfiguration     607.91
A04 Cryptographic Failures        554.53
A05 Injection                     536.02
A07 Authentication Failures       535.77
A06 Insecure Design               534.15
A10 Exceptional Conditions        530.96
X01 Lack of App Resilience        522.02
A08 Software/Data Integrity       385.35
A03 Software Supply Chain         368.84
A09 Logging & Alerting            350.19
X02 Memory Management Failures    271.16
Cách nói khi phỏng vấn: "Tôi từng thử lấy đúng bảng điểm OWASP công bố cho từng nhóm rồi cộng lại theo công thức của họ. Kết quả gần đúng nhưng không khớp hẳn: Broken Access Control ra khoảng sáu trăm ba mươi hai điểm trong khi OWASP ghi sáu trăm hai mươi mốt, và thứ tự ở giữa bảng hơi lệch, ví dụ Software or Data Integrity Failures tính ra thấp hơn một nhóm đã bị loại. Điều đó cho thấy thứ hạng là 'dựa trên dữ liệu' chứ không 'do dữ liệu quyết định' — có bước gom nhóm và phán đoán của nhóm tác giả. Vì vậy tôi không dùng khoảng cách giữa hạng năm và hạng sáu để ưu tiên việc trong team; tôi dùng bối cảnh hệ thống của mình."

11. Đọc kết quả (đây là phép tính lại của bài này, không phải số OWASP công bố):

2.5 Survey: vì sao dữ liệu thôi là chưa đủ

12. OWASP viết: "This installment of the Top Ten remains data-informed, but not blindly data-driven." Dữ liệu test là nhìn về quá khứ — từ lúc researcher tìm ra một loại lỗ hổng tới lúc tool test được nó ở quy mô lớn có thể mất nhiều năm, và có rủi ro có thể không bao giờ test tự động được. Nên một phần danh sách được dành cho community survey (khảo sát người làm AppSec và developer). Theo hình mapping chính thức, hai mục có dấu "From the Survey" năm 2025 là A03 Software Supply Chain Failures (đúng 50% người trả lời xếp nó hạng 1) và A09 Security Logging & Alerting Failures.

13. Lưu ý nguồn tự mâu thuẫn trong cách diễn đạt: đoạn Methodology viết "We ranked 12 categories based on the data contributed, and allowed two to be promoted or highlighted by responses from the community survey", còn đoạn "Why we use a community survey" viết "we only pick eight of the ten categories from the data … The other two categories are from the Top 10 community survey". Hai câu tương thích nếu hiểu là: xếp hạng 12 nhóm từ dữ liệu, giữ 8 nhóm, 2 suất còn lại do survey — và 12 − 8 − 2 nhóm dữ liệu dư ra thì rơi xuống Next Steps (X01, X02). Đây là cách hiểu của bài này, OWASP không viết đúng câu đó.

2.6 Root cause thay vì symptom

14. OWASP phân biệt hai loại CWE: root cause (nguyên nhân gốc — "Cryptographic Failure", "Misconfiguration") và symptom (triệu chứng — "Sensitive Data Exposure", "Denial of Service"). Họ chọn gom theo root cause "whenever possible as it's more logical for providing identification and remediation guidance". Lý do thực dụng: biết triệu chứng "lộ dữ liệu nhạy cảm" không nói cho developer phải sửa gì; biết nguyên nhân "không mã hoá / dùng thuật toán yếu / lộ key" thì biết ngay. Các lần đổi tên trong lịch sử đều theo hướng này: 2017 "Sensitive Data Exposure" → 2021 "Cryptographic Failures"; 2021 next step "Denial of Service" → 2025 X01 "Lack of Application Resilience" ("renamed as it described a symptom rather than a root cause").

15. Cái giá của root cause: các category chồng lên nhau. OWASP thừa nhận "it's basically impossible to create ten categories without some level of overlap". Ví dụ: thông báo lỗi lộ stack trace vừa có trong mô tả A02 Security Misconfiguration ("Error handling reveals stack traces…") vừa là CWE-209 của A10. Trong phỏng vấn, nói được "nó chồng lấn, và tôi xếp theo nguyên nhân: do cấu hình bật debug thì là A02, do code bắt exception sai thì là A10" là một câu trả lời tốt.

flowchart TD
  D["Dữ liệu đóng góp > 2,8 triệu ứng dụng<br/>số app được test + số app có ít nhất 1 CWE"] --> I["Incidence rate và Coverage<br/>theo từng CWE (589 CWE)"]
  N["NVD qua OWASP Dependency Check<br/>~175k bản ghi CVE → CWE"] --> E["Avg Exploit, Avg Impact<br/>CVSS v2/v3 có trọng số"]
  G["Gom CWE thành category<br/>ưu tiên root cause, trần 40 CWE"] --> S
  I --> S["Risk Score theo công thức"]
  E --> S
  S --> R["Xếp hạng 12 category từ dữ liệu"]
  R --> K["8 category giữ lại từ dữ liệu"]
  R --> X["Next Steps: X01 Resilience, X02 Memory"]
  V["Community survey"] --> P["2 suất: A03 Supply Chain, A09 Logging and Alerting"]
  K --> L["OWASP Top 10:2025"]
  P --> L

3. Mười mục của 2025 — mỗi mục một câu

Số liệu trong bảng lấy từ "Score table" trên trang chính thức của từng mục. "Avg incidence" là tỉ lệ trung bình ứng dụng mắc ít nhất một CWE của nhóm. Cột cuối là bài đi sâu trong series.

MụcÝ nghĩa một câuCWEAvg incidenceTotal CVEsBài
A01:2025 Broken Access ControlNgười dùng làm được việc ngoài quyền của mình (IDOR, thiếu check quyền ở API, CSRF) — và từ 2025 gồm cả SSRF (CWE-918)403,74%32.654Bài 1
A02:2025 Security MisconfigurationHệ thống/app/cloud được cấu hình sai về mặt bảo mật: tính năng thừa, tài khoản mặc định, debug bật, XXE163,00%1.375Bài 2
A03:2025 Software Supply Chain FailuresHỏng hoặc bị xâm nhập trong quá trình build, phân phối, cập nhật phần mềm — dependency lỗi thời, có lỗ hổng, hoặc bị cài mã độc65,72%11Bài 3
A04:2025 Cryptographic FailuresThiếu mã hoá, mã hoá yếu, lộ key, sinh số ngẫu nhiên không đủ an toàn (PRNG yếu)323,80%2.185Bài 4
A05:2025 InjectionInput không tin cậy tới được interpreter (DB, shell, trình duyệt) và bị thực thi như lệnh — SQLi, command injection, XSS373,08%62.445Bài 5
A06:2025 Insecure DesignThiếu hoặc thiết kế sai control ngay từ đầu (kể cả lỗ hổng business logic) — code hoàn hảo cũng không vá được391,86%7.647Bài 6
A07:2025 Authentication FailuresHệ thống nhận nhầm kẻ tấn công là người dùng hợp lệ: credential stuffing, brute force, session fixation, hardcoded credential362,92%7.147Bài 7
A08:2025 Software or Data Integrity FailuresTin code/dữ liệu chưa xác minh toàn vẹn: deserialization không tin cậy, mass assignment (CWE-915), plugin/CDN không rõ nguồn142,75%3.331Bài 8
A09:2025 Security Logging & Alerting FailuresKhông log, log sai (lộ dữ liệu nhạy cảm, log injection), hoặc có log mà không có alert nên không ai phản ứng53,91%723Bài 9
A10:2025 Mishandling of Exceptional ConditionsXử lý sai tình huống bất thường: lỗi lộ thông tin, thiếu tham số, null dereference, và nhất là failing open (lỗi thì cho qua)242,95%3.416Bài 10

Ba con số đáng nhớ để nói khi phỏng vấn: A01 và A02 đều có "100% of the applications tested were found to have some form of" lỗi thuộc nhóm (tức là ứng dụng nào được test cũng có ít nhất một dạng); A05 Injection có nhiều CVE nhất (62.445, trong đó XSS hơn 30k và SQL Injection hơn 14k theo trang A05); A03 chỉ có 11 CVE nhưng avg incidence cao nhất bảng — dấu hiệu của một loại rủi ro khó test, không phải hiếm gặp.

4. Bảng đối chiếu 2021 → 2025

4.1 OWASP nói gì về thay đổi

1. Trang Introduction tóm tắt: "There are two new categories and one consolidation in the Top Ten for 2025." Hai mục mới là A03 Software Supply Chain Failures (mở rộng từ A06:2021) và A10 Mishandling of Exceptional Conditions; một lần hợp nhất là SSRF gộp vào A01. Mọi dòng dưới đây đã đối chiếu với trang Introduction, trang của từng mục và hình mapping chính thức (2025-mappings.png).

2021→ 2025Loại thay đổiOWASP giải thích / ghi chú
A01:2021 Broken Access ControlA01:2025 Broken Access ControlGiữ hạng 1, phình thêm SSRF40 CWE (2021 là 34). Vẫn là nhóm có nhiều occurrence nhất trong dữ liệu.
A02:2021 Cryptographic FailuresA04:2025 Cryptographic FailuresTụt 2 bậc (2 → 4)32 CWE; ba trong các CWE phổ biến nhất liên quan PRNG yếu.
A03:2021 InjectionA05:2025 InjectionTụt 2 bậc (3 → 5)"maintaining its position relative to Cryptographic Failures and Insecure Design" — tụt vì hai nhóm khác vượt lên, không phải vì Injection hết.
A04:2021 Insecure DesignA06:2025 Insecure DesignTụt 2 bậc (4 → 6)OWASP thấy "noticeable improvements in the industry related to threat modeling"; bị A02 và A03 "leapfrog".
A05:2021 Security MisconfigurationA02:2025 Security MisconfigurationLên 3 bậc (5 → 2)Hành vi ứng dụng ngày càng phụ thuộc cấu hình; 100% app test có một dạng misconfiguration.
A06:2021 Vulnerable and Outdated ComponentsA03:2025 Software Supply Chain FailuresMở rộng phạm vi + đổi tên, lên 3 bậc (6 → 3); OWASP tính là "mục mới"Từ "dùng component có lỗ hổng đã biết" thành mọi sự cố trong hệ sinh thái dependency, build system, hạ tầng phân phối. Nguồn gốc xa hơn: 2013 "A9 – Using Components with Known Vulnerabilities". Vào danh sách nhờ survey.
A07:2021 Identification and Authentication FailuresA07:2025 Authentication FailuresGiữ hạng, đổi tênBỏ chữ "Identification" "to more accurately reflect the 36 CWEs in this category".
A08:2021 Software and Data Integrity FailuresA08:2025 Software or Data Integrity FailuresGiữ hạng, đổi một chữ"and" → "or" để làm rõ. Phạm vi: trust boundary và toàn vẹn của artifact/dữ liệu "at a lower level than Software Supply Chain Failures".
A09:2021 Security Logging and Monitoring FailuresA09:2025 Security Logging & Alerting FailuresGiữ hạng, đổi tên"Monitoring" → "Alerting": "Great logging with no alerting is of minimal value". Vào danh sách nhờ survey (lần thứ ba).
A10:2021 Server-Side Request Forgery (SSRF)gộp vào A01:2025Hợp nhất — không còn là category riêngCWE-918 nằm trong danh sách CWE của A01:2025. Năm 2021 SSRF chỉ có 1 CWE và vào danh sách nhờ survey (#1).
— (không có ở 2021)A10:2025 Mishandling of Exceptional ConditionsMục mới24 CWE về xử lý lỗi sai, lỗi logic, failing open. Một số CWE trước đây xếp vào "poor code quality" (Next Steps 2021) — "That was too general for us".

2. Có gì bị bỏ hẳn không? Không có mục 2021 nào biến mất hoàn toàn: SSRF vẫn còn, chỉ là một CWE trong A01. Những thứ "đứng ngoài" nằm ở trang Next Steps — so sánh hai bản:

Next Steps 2021 (A11:2021)Next Steps 2025
Code Quality issuesKhông còn mục riêng — một phần CWE chuyển vào A10:2025
Denial of ServiceX01:2025 Lack of Application Resilience (đổi tên theo root cause; điểm "very close" với A10)
Memory Management ErrorsX02:2025 Memory Management Failures (điểm survey thấp nhất, dù có nhiều CVE thứ ba)
—X03:2025 Inappropriate Trust in AI Generated Code ('Vibe Coding') — chưa có CWE/CVE nào, nhưng OWASP đưa vào vì AI-generated code "often contains more vulnerabilities"
flowchart LR
  subgraph y21["2021"]
    o01["A01 Broken Access Control"]
    o02["A02 Cryptographic Failures"]
    o03["A03 Injection"]
    o04["A04 Insecure Design"]
    o05["A05 Security Misconfiguration"]
    o06["A06 Vulnerable and Outdated Components"]
    o07["A07 Identification and Authentication Failures"]
    o08["A08 Software and Data Integrity Failures"]
    o09["A09 Logging and Monitoring Failures"]
    o10["A10 SSRF"]
  end
  subgraph y25["2025"]
    n01["A01 Broken Access Control"]
    n02["A02 Security Misconfiguration"]
    n03["A03 Software Supply Chain Failures (mới, survey)"]
    n04["A04 Cryptographic Failures"]
    n05["A05 Injection"]
    n06["A06 Insecure Design"]
    n07["A07 Authentication Failures"]
    n08["A08 Software or Data Integrity Failures"]
    n09["A09 Logging and Alerting Failures (survey)"]
    n10["A10 Mishandling of Exceptional Conditions (mới)"]
  end
  o01 -->|"giữ hạng 1"| n01
  o10 -.->|"gộp vào, CWE-918"| n01
  o05 -->|"lên 3 bậc"| n02
  o06 -->|"mở rộng phạm vi"| n03
  o02 -->|"tụt 2"| n04
  o03 -->|"tụt 2"| n05
  o04 -->|"tụt 2"| n06
  o07 -->|"đổi tên"| n07
  o08 -->|"and thành or"| n08
  o09 -->|"Monitoring thành Alerting"| n09
Cách nói khi phỏng vấn: "So với 2021 thì 2025 có hai mục mới và một lần gộp. Broken Access Control vẫn đứng đầu và nuốt luôn SSRF. Security Misconfiguration nhảy từ năm lên hai, và mục 'thư viện lỗi thời' của 2021 được mở rộng thành Software Supply Chain Failures ở hạng ba — tức là không chỉ thư viện có CVE mà cả build system, kênh phân phối, package bị cài mã độc. Ba mục mã hoá, injection và insecure design mỗi mục tụt hai bậc vì bị hai mục kia vượt. Bảy, tám, chín giữ hạng nhưng đổi tên, đáng nhớ nhất là logging thì nay nhấn vào alerting. Và mục mới ở hạng mười là xử lý tình huống bất thường, đặc biệt là lỗi thì cho qua."
10 mục OWASP Top 10:2021 di chuyển sang Top 10:2025 Cột trái là 10 mục 2021, cột phải là 10 mục 2025. Lần lượt từng mũi tên nối mục 2021 sang vị trí mới: A01 giữ hạng 1; Cryptographic Failures, Injection, Insecure Design tụt từ 2, 3, 4 xuống 4, 5, 6; Security Misconfiguration lên từ 5 lên 2; Vulnerable and Outdated Components mở rộng thành Software Supply Chain Failures ở hạng 3; A07, A08, A09 giữ hạng và đổi tên; SSRF bị gộp vào A01 bằng đường nét đứt. Cuối cùng A10:2025 Mishandling of Exceptional Conditions hiện ra như một mục mới. 2021 2025 A01:2021 Broken Access Control A02:2021 Cryptographic Failures A03:2021 Injection A04:2021 Insecure Design A05:2021 Security Misconfiguration A06:2021 Vulnerable and Outdated Components A07:2021 Identification and Authentication Failures A08:2021 Software and Data Integrity Failures A09:2021 Security Logging and Monitoring Failures A10:2021 Server-Side Request Forgery (SSRF) A01:2025 Broken Access Control A02:2025 Security Misconfiguration A03:2025 Software Supply Chain Failures A04:2025 Cryptographic Failures A05:2025 Injection A06:2025 Insecure Design A07:2025 Authentication Failures A08:2025 Software or Data Integrity Failures A09:2025 Security Logging and Alerting Failures A10:2025 Mishandling of Exceptional Conditions mở rộng MỚI giữ hạng (có thể đổi tên) lên hạng / mở rộng tụt 2 bậc gộp vào mục khác mục mới Không mục 2021 nào bị xoá hẳn: SSRF vẫn còn, dưới dạng CWE-918 trong A01:2025. A03 và A09 năm 2025 là hai mục do community survey đẩy lên.
Hình 1 — Mỗi mũi tên là một mục 2021 đi tới vị trí 2025. Màu xanh dương: giữ hạng (A07–A09 đổi tên); xanh lá: lên hạng (Misconfiguration 5 → 2, Outdated Components 6 → 3 và mở rộng thành Supply Chain); cam: ba mục tụt đúng 2 bậc; nét đứt vàng: SSRF gộp vào A01 và ô 2021 mờ đi; tím: A10:2025 hoàn toàn mới. Dựng lại theo hình 2025-mappings.png chính thức của OWASP.

4.2 Nếu interviewer học bản 2017: 2017 → 2021 trong một bảng

3. Nhiều interviewer học OWASP từ bản 2017 và vẫn nói "XSS là A7", "XXE là A4". Trang Introduction 2021 ghi: "three new categories, four categories with naming and scoping changes, and some consolidation". Ghép lại để nói được cả chuỗi 2017 → 2021 → 2025:

2017→ 2021→ 2025
A1 InjectionA03 InjectionA05 Injection
A2 Broken AuthenticationA07 Identification and Authentication FailuresA07 Authentication Failures
A3 Sensitive Data Exposure (symptom)A02 Cryptographic Failures (root cause)A04 Cryptographic Failures
A4 XML External Entities (XXE)gộp vào A05 Security Misconfigurationtrong A02 Security Misconfiguration (CWE-611)
A5 Broken Access ControlA01 Broken Access ControlA01 Broken Access Control
A6 Security MisconfigurationA05 Security MisconfigurationA02 Security Misconfiguration
A7 Cross-Site Scripting (XSS)gộp vào A03 Injectiontrong A05 Injection
A8 Insecure Deserializationgộp vào A08 Software and Data Integrity Failurestrong A08 Software or Data Integrity Failures (CWE-502)
A9 Using Components with Known VulnerabilitiesA06 Vulnerable and Outdated Componentsmở rộng thành A03 Software Supply Chain Failures
A10 Insufficient Logging & MonitoringA09 Security Logging and Monitoring FailuresA09 Security Logging & Alerting Failures
—Mới: A04 Insecure Design, A08 Software and Data Integrity Failures, A10 SSRFInsecure Design → A06; SSRF → gộp vào A01

4. Mạch chung qua ba bản: access control leo từ hạng 5 (2017) lên hạng 1 và giữ; injection đi từ hạng 1 xuống 3 rồi 5; các mục symptom-based (Sensitive Data Exposure, XSS, XXE như một mục riêng) dần bị thay bằng hoặc gộp vào mục root-cause; và các mục khó test (components, logging, SSRF) thường vào danh sách nhờ survey chứ không nhờ dữ liệu.

5. Tech lead dùng danh sách này trong team thế nào

Nguyên tắc của OWASP ở trang "Establishing a Modern Application Security Program": thêm "one or more security activities to each phase of the system development life cycle", và nếu đã có chương trình thì đo độ trưởng thành bằng OWASP SAMM hoặc DSOMM. Với một team 4–7 developer, cách thực dụng là gắn mỗi category vào bước của quy trình có khả năng bắt nó rẻ nhất:

flowchart TD
  RQ["Yêu cầu / spec<br/>chọn ASVS level"] --> TM["Threat modeling<br/>A06, A01, A10"]
  TM --> CR["Code + review checklist<br/>A01, A05, A07, A10"]
  CR --> CI["CI: SAST, SCA, secret scan<br/>A05, A03, A04, A02"]
  CI --> ST["Staging: DAST, cấu hình<br/>A02, A05, A07"]
  ST --> PR["Production: log + alert, patch<br/>A09, A03"]
  PR -. "sự cố, pentest, bug report" .-> TM

5.1 Threat modeling — nơi duy nhất bắt được A06

1. OWASP viết về A06: "we need to move beyond 'shift-left' in the coding space, to pre-code activities such as requirements writing and application design". Không SAST nào phát hiện được "luồng nộp bài không chặn nộp sau hạn khi đổi múi giờ" vì đó không phải lỗi code mà là control không tồn tại. Thứ bắt được là một buổi threat modeling (mô hình hoá mối đe doạ) theo OWASP Threat Modeling Cheat Sheet: vẽ data flow, đánh dấu trust boundary, hỏi "kẻ xấu làm gì ở mỗi mũi tên".

2. Trade-off: threat modeling tốn thời gian người giỏi nhất team và dễ thành thủ tục. Cách giữ nó có giá trị: chỉ làm cho tính năng chạm vào tiền, điểm, dữ liệu cá nhân, quyền, hoặc gọi ra ngoài (URL do người dùng nhập — SSRF nay là A01); giới hạn 30–60 phút (số minh hoạ), kết quả là vài security user story (OWASP gợi ý "Add security user stories alongside all of your other user stories") chứ không phải tài liệu dài. Không hợp: CRUD nội bộ ít rủi ro — ở đó checklist review là đủ.

5.2 Code review checklist — dùng Top 10 làm khung, không làm nội dung

3. Top 10 là "bare minimum" cho peer review checklist theo bảng của OWASP. Biến nó thành câu hỏi cụ thể cho stack của team mới có ích; mười dòng "đã kiểm tra A01…A10" thì vô dụng. Ví dụ checklist cho Laravel/NestJS (câu hỏi do bài này đề xuất; cách làm chi tiết ở từng bài):

MụcCâu hỏi người review phải trả lời được
A01Endpoint mới lấy ID từ request thì đã check object đó thuộc user/tenant hiện tại chưa (Policy/Guard), hay chỉ check "đã đăng nhập"? Có fetch URL do người dùng nhập không?
A02Có biến môi trường/cấu hình mới không — giá trị mặc định ở production là an toàn chưa (debug, CORS, header)?
A03Có thêm/nâng dependency không — package có người bảo trì không, lock file có đổi bất thường không?
A04Token/ID bí mật sinh bằng gì (CSPRNG hay random thường)? Secret có lọt vào code/log không?
A05Có SQL raw, whereRaw, query builder ghép chuỗi, render HTML không escape, gọi shell không?
A07Luồng login/reset/OTP mới có rate limit, có tái sinh session sau login không?
A08Có unserialize/deserialization dữ liệu từ ngoài, mass assignment ($fillable/$guarded, DTO whitelist) không?
A09Hành động nhạy cảm mới (đổi quyền, đổi điểm, xuất dữ liệu) có audit log không, log có lọt PII/token không?
A10catch mới làm gì khi lỗi — trả về "cho qua" hay từ chối? Khi Redis/DB/service ngoài chết thì nhánh code này fail open hay fail closed?

4. Trade-off: checklist dài làm review chậm và bị tick cho có. Cách phổ biến là để checklist trong MR template nhưng chỉ bắt buộc với MR chạm vào vùng nhạy cảm (auth, phân quyền, upload, thanh toán/điểm) — Minato đã có MR template bắt buộc cho migration/cache/job tương thích ngược (theo CV), nên thêm một mục bảo mật cùng chỗ là tự nhiên hơn là dựng quy trình mới.

5.3 SAST / DAST / SCA trong CI — tool phủ được gì, không phủ được gì

5. Ba loại tool, giải nghĩa: SAST (Static Application Security Testing — phân tích mã nguồn không chạy app), DAST (Dynamic — tấn công thử vào app đang chạy từ bên ngoài), SCA (Software Composition Analysis — đối chiếu dependency với cơ sở dữ liệu lỗ hổng). OWASP khuyến nghị "static analysis, software composition analysis, secret, and Infrastructure-as-Code (IaC) scanners" và lịch quét định kỳ "dynamic, static, secrets, IaC, and software composition analysis".

LoạiPhủ tốtPhủ kém / không phủTrade-off khi đặt trong pipeline
SCA (vd composer audit, npm audit)A03 phần "component có CVE đã biết"Package bị cài mã độc chưa có advisory; build system bị xâm nhập (phần lớn A03); A08Rẻ, nhanh. Advisory mới có thể làm pipeline đỏ dù không ai đổi code — phải thoả thuận trước: chặn merge hay chỉ cảnh báo, SLA vá bao lâu
SAST (rule bảo mật như Semgrep; PHPStan/Larastan là kiểm tra kiểu, không phải SAST bảo mật)A05 (luồng input → sink), A04 (hàm crypto/random yếu), một phần A02, A10 (catch rỗng)A01 logic phân quyền theo nghiệp vụ, A06, hiệu lực của A09False positive nhiều → cần baseline và chỉ chặn rule độ tin cậy cao, như cách bài static analysis dùng baseline cho PHPStan
Secret scanningA04/A07 (key, password hardcode — CWE-798 nằm ở A07)Secret đã lọt vào lịch sử git trước khi bậtRẻ; khi bắt được thì phải rotate secret, xoá commit không đủ
DAST (chạy trên staging)A02 (header, debug, cấu hình), một phần A05, A07Logic nhiều bước, A01 giữa hai user khác nhau (trừ khi cấu hình nhiều tài khoản), A06Chậm (phút đến giờ) → thường chạy theo lịch hoặc trước release, không chặn từng MR

6. Phần CI/CD cụ thể (stage, cache, build một lần dùng cho 3 môi trường) đã có ở bài GitLab CI/CD cho Laravel; cách dùng static analysis với baseline và composer audit như "tầng thứ ba" của stage quality ở bài pint + static analysis; promote bằng tag ở bài git workflow. Bài này không lặp lại — chỉ thêm một ý: build một lần, deploy nhiều lần (artifact bất biến) vốn là một control của A08/A03, vì môi trường production chạy đúng artifact đã được quét.

5.4 Chọn ASVS level

7. ASVS 5.0.0 (phát hành 30/05/2025) định nghĩa ba level. Theo chương "What is the ASVS": L1 là "the minimum requirements … around 20% of the ASVS requirements", chủ yếu lớp phòng thủ đầu tiên; L2 là mức "Most applications should be striving to achieve", đạt L2 nghĩa là làm khoảng 70% requirement (toàn bộ L1 + L2); L3 là ~30% còn lại, chủ yếu defense-in-depth và control khó làm. ASVS không áp level cho ai: "an early-stage startup that is only collecting limited sensitive data may decide to focus on Level 1 … but a bank may have difficulty justifying anything less than Level 3".

8. ASVS còn khuyến khích fork: "each organization should create its own tailored ASVS, omitting irrelevant sections (e.g., GraphQL, WebSockets, SOAP, if unused)", bắt đầu từ L1 rồi nâng theo rủi ro, giữ nguyên số hiệu requirement để truy vết. Với một LMS có điểm thi, dữ liệu cá nhân sinh viên và nhiều trường dùng chung (multi-tenant), lựa chọn hợp lý thường là L1 cho toàn hệ thống + L2 cho các vùng auth, phân quyền, upload, xuất dữ liệu — đây là đề xuất của bài này, không phải quy định của ASVS. Đổi lại: L2 đầy đủ là hàng trăm requirement, một team 4 người không làm hết trong một quý; fork rút gọn thì phải có người chịu trách nhiệm giữ nó cập nhật.

Khi nào KHÔNG nên dùng Top 10 làm thước đo. Khi khách hàng/kiểm toán đòi bằng chứng (dùng ASVS, có level và requirement kiểm chứng được); khi so sánh vendor tool (OWASP nói claim "phủ 100% Top 10" là sai); khi hệ thống chính là API thuần hoặc app LLM (dùng API Security Top 10, LLM Top 10 làm khung chính, Top 10 làm phụ); và khi ưu tiên backlog bảo mật — thứ hạng chung của ngành không thay được rủi ro cụ thể của hệ thống mình.

6. Thứ tự đọc series và cách trả lời "kể tên OWASP Top 10"

6.1 Đọc theo nhóm "control nằm ở đâu", không nhất thiết theo số

flowchart TD
  B0["Bài 0<br/>bản đồ"] --> G1["Nhóm 1: mỗi request<br/>A01, A05, A07"]
  G1 --> G2["Nhóm 2: nền tảng và build<br/>A02, A03, A08, A04"]
  G2 --> G3["Nhóm 3: thiết kế và vận hành<br/>A06, A10, A09"]

1. Nhóm 1 — control chạy trên mỗi request: A01 (có ai được làm việc này với object này không), A05 (input có bị diễn giải thành lệnh không), A07 (người này có thật là người này không). Đây là nhóm interviewer hỏi sâu nhất và là nơi code Laravel/NestJS hằng ngày hay sai nhất. Đọc trước. Phần RBAC/ABAC đã có sẵn ở bài RBAC và bài ABAC — Bài 1 sẽ link sang thay vì lặp.

2. Nhóm 2 — nền tảng, cấu hình, chuỗi build: A02, A03, A08, A04. Đọc A03 ngay trước A08 vì OWASP định nghĩa A08 là cùng vấn đề toàn vẹn nhưng "at a lower level". Bài nâng cấp PHP 8.4 vì PHP2Shell là một case thực tế của A03 (vá runtime có lỗ hổng).

3. Nhóm 3 — thiết kế và vận hành: A06, A10, A09. Đây là nhóm Tech Lead được kỳ vọng nói tốt hơn developer: thiết kế control, hành vi khi hỏng (fail open/closed), và phát hiện sự cố. Đọc cuối vì nó dựa trên ví dụ của hai nhóm trước.

4. Kế hoạch ôn gợi ý (minh hoạ, chỉnh theo lịch phỏng vấn): tuần 1 — Bài 0 + nhóm 1 (mỗi bài một buổi, tự trả lời mục "Câu hỏi phụ" không nhìn đáp án); tuần 2 — nhóm 2 + nhóm 3; ngày cuối — đọc lại mục 7 "Áp dụng vào CV" của cả 10 bài và tập nói to phần "Cách nói khi phỏng vấn".

6.2 Trả lời "kể tên OWASP Top 10"

Cách nói khi phỏng vấn: "Bản mới nhất là 2025. Đứng đầu vẫn là Broken Access Control, giờ gộp luôn SSRF. Thứ hai là Security Misconfiguration, thứ ba là Software Supply Chain Failures — bản mở rộng của mục thư viện lỗi thời. Rồi tới Cryptographic Failures, Injection, Insecure Design, Authentication Failures, Software or Data Integrity Failures, Security Logging and Alerting Failures, và mục mới là Mishandling of Exceptional Conditions. Tôi hay nhớ theo ba nhóm: kiểm soát trên mỗi request là phân quyền, injection, xác thực; nền tảng và chuỗi build là cấu hình, supply chain, toàn vẹn, mã hoá; còn thiết kế và vận hành là insecure design, xử lý lỗi và logging-alerting. Và tôi coi nó là tài liệu nâng cao nhận thức, còn khi cần chuẩn để nghiệm thu thì dùng ASVS."

5. Bẫy thường gặp khi trả lời: (a) đọc danh sách 2021 và gọi là "mới nhất" — nhắc SSRF như mục số 10 là dấu hiệu lộ ngay; (b) nói "Top 10 là standard bảo mật" — OWASP tự nói là awareness; (c) kể tên mà không cho được một ví dụ trong hệ thống mình — interviewer sẽ hỏi "ở hệ thống của anh thì cái nào đáng lo nhất", và đó là mục 7.

7. Áp dụng vào hệ thống trong CV

Hai hệ thống trong cv-v3.md: LMS Uni (Moodle PHP + NestJS student portal + Next.js, MySQL primary/replica, Redis tách instance cho session/cache/lock, Nginx LB trước 3 app node, NFS cho moodledata, AWS S3, worker trên nhiều VPS, ~100.000 sinh viên, cao điểm ~8.000 đồng thời) và LMS Micro-learning (Laravel + Livewire modular monolith, NestJS, Next.js, PostgreSQL, Redis, MongoDB, MinIO, GitLab CI, Docker, 4 trường ~10.000 sinh viên). Bảng dưới chỉ là bản đồ; phân tích sâu nằm ở mục 7 của từng bài. Dấu * = giả định, CV không nói.

MụcLMS Uni (Moodle)LMS Micro-learning (Laravel/Livewire)Mức đáng lo
A01Student portal NestJS dùng chung database với Moodle (CV) → portal không đi qua capability check của Moodle, phải tự kiểm tra quyền ở mọi API đọc điểm/bài nộp — chỗ dễ có IDOR*. Link tải báo cáo xác thực bằng JWT (CV): token có gắn đúng user và hết hạn ngắn không*4 trường dùng chung codebase (CV) → cô lập tenant là A01 cốt lõi*; MinIO presigned URL*; Livewire public property bị sửa từ client*Cao nhất
A02Nhiều thành phần hạ tầng tự vận hành: Nginx LB, 3 node, NFS, Redis nhiều instance → cấu hình Redis/NFS chỉ mở trong mạng nội bộ chưa*; Moodle debug display ở production*Docker image, cấu hình 3 môi trường; APP_DEBUG ở production*Cao
A03CV ghi từng nâng Moodle 2.7 "đã hết hỗ trợ bảo mật" lên 3.5 LTS — câu chuyện A03 có thật để kể; plugin Moodle bên thứ ba*; npm cho NestJS/Next.jsComposer + npm, GitLab CI build image (CV)Cao
A04Chữ ký JWT cho link báo cáo (thuật toán, nơi giữ key)*Idempotency key và token sinh bằng gì*Trung bình
A05Plugin Moodle tự viết dùng SQL raw*; báo cáo thống kê nặng (CV) thường là SQL tay*MongoDB (CV) → NoSQL operator injection*; Livewire/Blade render HTML*Trung bình–cao
A06Nghiệp vụ hạn nộp bài, quiz cao điểm cuối hạn (CV): luật nộp muộn, làm lại, đổi đáp án*Idempotency key chống nộp trùng (CV) là một control thiết kế tốt để kểTrung bình
A07Session nằm trong Redis riêng (CV): thời hạn, thu hồi khi đổi mật khẩu*; SSO giữa Moodle và portal*Login của 4 trường; brute force/credential stuffing*Trung bình–cao
A08Payload cache và dữ liệu job của worker phải tương thích ngược (CV) → định dạng serialize; ai ghi được vào Redis thì có đưa được object độc vào không*Mass assignment Eloquent (CWE-915 thuộc A08)*; artifact "build một lần" (CV) là control tốtTrung bình
A09Đã có OpenTelemetry, Prometheus, Grafana, Sentry (CV) — nhưng đó là observability vận hành; có alert cho sự kiện bảo mật (login sai hàng loạt, đổi điểm bất thường) không là câu hỏi riêng*; trace/log có chứa PII không (CWE-532)*Như bên trái*Trung bình (dễ bị hỏi vì CV nhấn mạnh observability)
A10Redis distributed lock (CV): Redis chết thì nhánh code fail open (cho chạy song song) hay fail closed*; queue job lỗi giữa chừng*Idempotency bằng Redis SET NX + unique constraint (CV) — khi Redis lỗi vẫn còn unique constraint ở DB chặn, là ví dụ tốt về không fail openTrung bình

Câu trả lời nên chuẩn bị cho "Ở hệ thống của anh, mục nào đáng lo nhất?": A01 — vì student portal dùng chung database với Moodle nên toàn bộ logic phân quyền của Moodle phải được viết lại ở NestJS, và mọi API trả dữ liệu theo ID phải tự kiểm tra quyền sở hữu. Nói kèm cách đã/sẽ kiểm soát (guard/policy tập trung, test cho từng cặp user–object) — chi tiết ở Bài 1. Nếu thực tế portal đã giải quyết khác (vd gọi qua Moodle web service), Minato nên sửa câu này theo đúng hệ thống.

8. Câu hỏi phụ interviewer hay hỏi tiếp

Câu hỏiTrả lời ngắn
OWASP Top 10 có phải là standard để làm compliance không?Không. OWASP tự gọi là awareness document; dùng làm chuẩn thì chỉ là "bare minimum". Cần chuẩn kiểm chứng được thì dùng ASVS (5.0.0, ba level).
Vì sao SSRF không còn là mục riêng?2025 gộp SSRF (CWE-918) vào A01. Năm 2021 nó chỉ có 1 CWE và vào danh sách nhờ survey. Cách hiểu của tôi (OWASP không viết câu này): SSRF là server bị lợi dụng để truy cập tài nguyên mà người gọi không có quyền — bản chất là thiếu kiểm soát truy cập ở chiều request đi ra.
Injection tụt xuống 5 nghĩa là injection ít nguy hiểm hơn?Không. Nó vẫn là nhóm có nhiều CVE nhất (62.445) và 100% app được test cho nó. Nó tụt vì Misconfiguration và Supply Chain vượt lên; vị trí tương đối với Crypto và Insecure Design không đổi.
A03 và A08 khác nhau thế nào?A03 là chuỗi cung ứng: dependency, build system, kênh phân phối. A08 là toàn vẹn ở mức thấp hơn: tin code/dữ liệu chưa xác minh — deserialization (CWE-502), mass assignment (CWE-915), include từ nguồn không tin cậy (CWE-829).
A10 khác gì A09 và A02?A10 là code xử lý tình huống bất thường sai — nhất là fail open. A09 là không ghi nhận và không báo động. A02 là cấu hình sai. Chúng chồng lấn (stack trace lộ ra là cả A02 lẫn CWE-209 của A10); tôi xếp theo nguyên nhân gốc.
Incidence rate khác frequency thế nào, vì sao quan trọng?Incidence = phần trăm ứng dụng có ít nhất một lỗi; frequency = số lần lỗi xuất hiện. OWASP bỏ frequency vì tool tự động đếm từng instance còn tester thủ công ghi một lần — đếm instance sẽ thiên về dữ liệu tool.
Tool SAST quảng cáo "phủ 100% OWASP Top 10", tin được không?Không. OWASP viết rõ claim full coverage là "simply untrue" — A06 nằm ngoài phần lớn hình thức test, A09 chỉ kiểm chứng được bằng phỏng vấn và mẫu incident response.
Team 4 người, chưa có gì về bảo mật, bắt đầu từ đâu?SCA và secret scan trong CI (rẻ, ít false positive), checklist review cho MR chạm auth/phân quyền/upload, một buổi threat modeling cho tính năng rủi ro nhất, alert cho vài sự kiện bảo mật then chốt. Sau đó mới tới ASVS L1 có fork.
CWE Top 25 và OWASP Top 10 dùng khi nào?CWE Top 25 là 25 điểm yếu cụ thể cho mọi loại phần mềm — hợp để cấu hình rule cho tool, đào tạo theo ngôn ngữ. OWASP Top 10 là 10 nhóm rủi ro web — hợp để đào tạo và nói chuyện với người không chuyên.
Hệ thống chủ yếu là API thì dùng danh sách nào?OWASP API Security Top 10 (2023) làm khung chính — nó tách object-level và property-level authorization, resource consumption mà Top 10 web gộp chung — và Top 10 2025 làm bổ sung.

Chưa verify

Nguồn

Series OWASP Top 10:2025: Bài 0 — tổng quan (bài này) · Tiếp: Bài 1 — A01 Broken Access Control →