Giới thiệu về OWASP Top Ten 2021
Trong bài viết này, chúng ta sẽ khám phá các danh mục của OWASP Top Ten 2021 thông qua các cảnh báo từ trình phân tích PVS-Studio Java. Nếu bạn muốn tìm hiểu về các mẫu lỗ hổng tiềm ẩn trong mã Java hoặc học về OWASP Top Ten, bài viết này dành cho bạn!
OWASP là gì?
OWASP (Open Web Application Security Project) là một tổ chức toàn cầu phi lợi nhuận với sứ mệnh nâng cao bảo mật ứng dụng phần mềm. Dự án OWASP Top Ten là một trong những sáng kiến nổi bật nhất của họ, cung cấp danh sách các lỗ hổng bảo mật phổ biến nhất mà các nhà phát triển cần chú ý.
Tại sao SAST lại quan trọng?
SAST (Static Application Security Testing) là phương pháp kiểm tra mã nguồn ứng dụng nhằm phát hiện các lỗ hổng bảo mật tiềm ẩn. Điều này giúp ngăn chặn các vấn đề bảo mật phần mềm trước khi chúng trở thành lỗ hổng trong ứng dụng. SAST là một phần quan trọng trong quy trình phát triển phần mềm, giúp giảm thiểu rủi ro và chi phí khắc phục sự cố sau này.
Các loại lỗ hổng trong OWASP Top Ten 2021
Chúng ta sẽ xem xét các danh mục của OWASP Top Ten 2021 theo thứ tự, mô tả từng danh mục và đưa ra ví dụ về mã nguồn dễ bị tổn thương mà trình phân tích PVS-Studio cảnh báo.
A01:2021 — Kiểm soát truy cập bị phá vỡ
Kiểm soát truy cập bị phá vỡ là loại lỗ hổng cho phép kẻ tấn công truy cập vào thông tin nhạy cảm hoặc thực hiện các hành động không được phép. Dưới đây là một ví dụ:
java
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String query = request.getQueryString();
if (query.contains("url")) {
String url = request.getParameter("url");
response.sendRedirect(url); // <=
}
}
}
Cảnh báo từ PVS-Studio: V5324 Lỗ hổng chuyển hướng mở có thể xảy ra. Dữ liệu có thể bị ô nhiễm trong biến 'url'.
Để ngăn chặn điều này, server cần kiểm tra xem URL có trong danh sách cho phép hay không:
java
private static final List<String> ALLOWED_DOMAINS = List.of(
"https://allowed-host1.com",
"https://allowed-host2.com"
);
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String query = request.getQueryString();
if (query.contains("url")) {
String url = request.getParameter("url");
if (ALLOWED_DOMAINS.contains(url)) {
response.sendRedirect(url);
} else {
//....
}
}
}
}
A02:2021 — Lỗi mã hóa
Lỗi mã hóa liên quan đến việc mã hóa không đúng cách dữ liệu nhạy cảm, chẳng hạn như sử dụng các thuật toán mã hóa lỗi thời.
Ví dụ:
java
public static void callExternalApi() throws Exception {
SSLContext sslContext = SSLContext.getInstance("TLSv1"); // <=
sslContext.init(null, null, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
}
Cảnh báo từ PVS-Studio: V5313 Không sử dụng các phiên bản cũ của giao thức SSL/TLS.
A03:2021 — Tiêm mã
Tiêm mã xảy ra khi dữ liệu không đáng tin cậy được truyền vào các phần quan trọng của ứng dụng. Ví dụ, SQL Injection:
java
String sql = "SELECT * FROM demoTable WHERE name = '" + name + "'"; // <=
Để bảo vệ ứng dụng, hãy sử dụng các truy vấn có tham số:
java
String sql = "SELECT * FROM demoTable WHERE name = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{name}, DemoObject.class);
A04:2021 — Thiết kế không an toàn
Thiết kế không an toàn bao gồm việc xây dựng kiến trúc ứng dụng yếu kém. Ví dụ:
java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
String requestedSessionId = req.getRequestedSessionId();
if (requestedSessionId != null && requestedSessionId.startsWith("ADMIN-")) {
// ....
}
}
A05:2021 — Cấu hình bảo mật không chính xác
Cấu hình bảo mật không chính xác bao gồm việc bật các cổng hoặc dịch vụ không cần thiết:
java
System.setProperty(key, value); // <=
A06:2021 — Thành phần dễ bị tổn thương và lỗi thời
Vấn đề này liên quan đến việc sử dụng các phiên bản thư viện hoặc framework chứa lỗ hổng bảo mật đã biết.
A07:2021 — Lỗi xác thực và nhận dạng
Lỗi xác thực và nhận dạng liên quan đến quản lý phiên hoặc xác thực người dùng không chính xác:
java
registry.addMapping("/**").allowedOrigins("*"); // <=
A08:2021 — Lỗi tính toàn vẹn phần mềm và dữ liệu
Lỗi tính toàn vẹn phần mềm và dữ liệu dẫn đến các lỗi như cập nhật mà không có chữ ký số:
java
ObjectInputStream ois = new ObjectInputStream(in); // <=
A09:2021 — Lỗi ghi nhật ký và giám sát bảo mật
Lỗi ghi nhật ký và giám sát bảo mật có thể gây cản trở việc phát hiện sự cố:
java
log.info("Access {} {}?{} from {}", method, uri, qs, ip); // <=
A10:2021 — Tấn công SSRF (Server-Side Request Forgery)
Tấn công SSRF là khi server kết nối đến tài nguyên bên ngoài mà không kiểm tra:
java
HttpURLConnection conn = (HttpURLConnection) external.openConnection(); // <=
Thực hành tốt nhất và mẹo hiệu suất
- Luôn sử dụng các thư viện và framework mới nhất.
- Kiểm tra mã nguồn định kỳ với SAST.
- Đảm bảo tất cả các đầu vào người dùng đều được kiểm tra và xác thực.
Những cạm bẫy phổ biến
- Thiếu kiểm tra đầu vào.
- Sử dụng các thư viện lỗi thời.
- Cấu hình không chính xác.
Kết luận
Chúng ta đã đi qua các danh mục OWASP Top Ten 2021 với các ví dụ rõ ràng và cách phát hiện lỗ hổng. Hãy thử nghiệm trình phân tích của PVS-Studio và chia sẻ ý kiến của bạn với chúng tôi!
Câu hỏi thường gặp (FAQ)
1. OWASP Top Ten có bao nhiêu lỗ hổng? 10 lỗ hổng chính.
2. Tại sao SAST lại quan trọng? Giúp phát hiện lỗ hổng trước khi phát hành.
3. Làm thế nào để cải thiện bảo mật ứng dụng? Thực hiện kiểm tra định kỳ và sử dụng các công cụ hiện đại.