OWASP Top 10 2025: những thay đổi quan trọng mà developer không nên bỏ qua

OWASP vừa cập nhật Top 10 dựa trên dữ liệu từ 2.8 triệu ứng dụng. Broken Access Control vẫn giữ vị trí #1, nhưng điều đáng chú ý hơn là **Supply Chain Failures nhảy vào top 3** và một category hoàn toàn mới xuất hiện — *Mishandling of Exceptional Conditions*. Nếu bạn build web application với .NET, đây là thứ bạn cần đọc trước khi merge request tiếp theo. ---

Vấn đề

Tuần trước, tôi đang review code cho một tính năng mới trong dự án e-commerce. Pull request trông sạch — unit test xanh, code style đúng convention. Nhưng khi nhìn kỹ vào API endpoint trả về thông tin đơn hàng, tôi thấy ngay vấn đề:

// Controller: GET /api/orders/{orderId}
public async Task<IActionResult> GetOrder(int orderId)
{
    var order = await _db.Orders.FindAsync(orderId);
    return Ok(order);
}

Không có bất kỳ kiểm tra quyền sở hữu nào. Bất kỳ user đã đăng nhập nào cũng có thể lấy đơn hàng của người khác chỉ bằng cách đổi số orderId trên URL.

Đây không phải lỗi lập trình viên thiếu kinh nghiệm tạo ra — đây là Broken Access Control, lỗ hổng #1 trong OWASP Top 10 2025, ảnh hưởng đến 3.73% tổng số ứng dụng được kiểm thử. Tính ra cứ 27 ứng dụng web thì có 1 cái dính lỗi này.


OWASP Top 10 2025: bức tranh toàn cảnh

OWASP vừa phát hành bản cập nhật dựa trên dữ liệu từ 2.8 triệu ứng dụng được kiểm thử bởi 13 tổ chức trên toàn cầu. Đây là lần đầu tiên sau 4 năm (kể từ bản 2021) danh sách được làm mới.

Rank Category Thay đổi so với 2021
A01 Broken Access Control Giữ nguyên #1
A02 Security Misconfiguration ↑ Tăng từ #5#2
A03 Software Supply Chain Failures MỚI (mở rộng từ A08)
A04 Cryptographic Failures ↓ Giảm từ #2#4
A05 Injection ↓ Giảm từ #3#5
A06 Insecure Design ↓ Giảm từ #4#6
A07 Authentication Failures Giữ nguyên #7
A08 Software/Data Integrity Failures Giữ nguyên #8
A09 Security Logging & Alerting Giữ nguyên #9
A10 Mishandling of Exceptional Conditions MỚI

Ba thay đổi lớn nhất cần phân tích kỹ:


Phân tích: những thay đổi đáng chú ý nhất

1. Security Misconfiguration nhảy lên #2

Trước đây ở vị trí #5, nay leo lên #2. Tại sao?

Vì attack surface đã thay đổi. Năm 2021, misconfiguration chủ yếu là server settings. Năm 2025, nó bao gồm:

  • Default credentials không đổi sau deployment (Docker, Kubernetes, databases)
  • Debug endpoints còn bật trong production — /swagger, /metrics, error stack traces
  • Security headers thiếu — Content-Security-Policy, X-Frame-Options, HSTS
  • Overly permissive CORSAccess-Control-Allow-Origin: * trên API nhạy cảm
  • Cloud storage để public không cần thiết (S3 bucket, Azure Blob)

Kiểm tra nhanh trên ASP.NET Core:

// ❌ NGUY HIỂM: Swagger và error details trong production
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();          // Chỉ dev
    app.UseDeveloperExceptionPage(); // Chỉ dev
}

// ✅ ĐÚNG: Production có error handling riêng
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

// Security headers — thêm vào middleware pipeline
app.Use(async (context, next) =>
{
    context.Response.Headers["X-Content-Type-Options"] = "nosniff";
    context.Response.Headers["X-Frame-Options"] = "DENY";
    context.Response.Headers["Content-Security-Policy"] = 
        "default-src 'self'; script-src 'self'";
    await next();
});

2. Software Supply Chain Failures — category mới ở #3

Đây là điểm thay đổi lớn nhất về mặt tư duy. OWASP không chỉ mở rộng A08 (Software/Data Integrity) mà tạo ra một category riêng, phản ánh thực tế của 2025: 454,648 malicious npm packages được publish trong năm 2025. Tháng 9/2025, 18 packages bị compromise với tổng 2.6 tỷ weekly downloads bị ảnh hưởng.

NuGet ecosystem tuy ổn định hơn npm, nhưng không miễn dịch. Checklist tối thiểu cho .NET developer:

# Kiểm tra vulnerable packages
dotnet list package --vulnerable

# Lock dependencies — commit packages.lock.json vào repo
dotnet restore --use-lock-file

# CI/CD: Fail build nếu có vulnerability
dotnet list package --vulnerable --include-transitive | grep -i "HIGH\|CRITICAL" && exit 1

3. A10 mới: Mishandling of Exceptional Conditions

Lần đầu tiên error handling trở thành một vulnerability category riêng. Cụ thể hơn là:

Lỗi thường gặp:

// ❌ NGUY HIỂM: Expose stack trace, internal paths, connection strings
try
{
    var result = await _db.ExecuteAsync(query);
}
catch (Exception ex)
{
    return BadRequest(ex.ToString()); // Attacker thấy toàn bộ stack trace
}

// ✅ ĐÚNG: Log chi tiết internally, trả về generic message
catch (Exception ex)
{
    _logger.LogError(ex, "Database operation failed for user {UserId}", userId);
    return StatusCode(500, "Đã xảy ra lỗi. Vui lòng thử lại sau.");
}

Error messages không nên chứa:

  • Stack traces
  • Internal file paths (D:\Projects\MyApp\src\...)
  • Database schema details
  • Connection string fragments
  • Version numbers của framework/library

Điều AI-generated code làm tình hình tệ hơn

OWASP 2025 lần đầu đề cập đến rủi ro từ LLM coding assistants. Code được generate từ ChatGPT, Copilot, Cursor... thường mang pattern từ dữ liệu training cũ — và đó là code viết trước khi các best practices về security được phổ biến.

Pattern thường thấy trong AI-generated code:

  • String concatenation trong SQL (Injection — A05)
  • JWT không validate algorithm (Authentication Failures — A07)
  • Missing authorization checks (Broken Access Control — A01)

Không phải AI code luôn sai, nhưng security review cho AI-generated code cần chặt hơn review code viết tay, vì developer có xu hướng tin tưởng "nó trông có vẻ đúng" mà không đặt câu hỏi.


Best practices áp dụng ngay

Dựa trên OWASP Top 10 2025, đây là danh sách tôi recommend team làm ngay trong sprint tới:

Tuần 1 — Broken Access Control (A01):

  • [ ] Audit tất cả API endpoints — mỗi endpoint có kiểm tra ownership không?
  • [ ] Thêm authorization test case: user A không đọc được data của user B
  • [ ] Review middleware pipeline — [Authorize] attribute có đúng chỗ không?

Tuần 2 — Security Misconfiguration (A02):

  • [ ] Tắt Swagger/debug endpoints trong production build
  • [ ] Thêm security headers vào pipeline
  • [ ] Review CORS policy — AllowAnyOrigin có cần thiết không?

Tuần 3 — Supply Chain (A03):

  • [ ] Chạy dotnet list package --vulnerable
  • [ ] Commit packages.lock.json vào version control
  • [ ] Thêm vulnerability scan vào CI/CD pipeline

Tuần 4 — Error Handling (A10):

  • [ ] Tìm tất cả catch block đang return ex.ToString() hoặc ex.Message
  • [ ] Chuẩn hóa error response format — không expose internal details
  • [ ] Verify logging không ghi token, password vào log files

Kết

OWASP Top 10 không phải danh sách để đọc một lần rồi để đó. Nó là công cụ làm việc — mỗi category là một checklist cần review định kỳ.

Bài tiếp theo trong series này tôi sẽ đi sâu vào SQL Injection trong ASP.NET Core: attack scenario thực tế, code vulnerable, và cách fix dứt điểm bằng EF Core, Dapper, và ADO.NET.

Đội ngũ BKGlobal sử dụng OWASP Top 10 như một trong những baseline chính trong quy trình security review. Nếu team bạn chưa có checklist tương tự, đây là thời điểm tốt để bắt đầu.


Thiết Kiếm — BKGlobal Tech Team

#BKGlobal #appsec #security #owasp #securecoding

Bảo mật & AppSec

Xem tất cả