Bảo mật 02/09/2026 9 phút

Một chuỗi 30 ký tự giữ lõi CPU bận 20 giây, 49 KB nở thành 50 MB — DoS tầng ứng dụng không cần lưu lượng, nó cần chi phí bất đối xứng

DoS thường được hình dung là cơn lũ lưu lượng. Nhưng loại nguy hiểm hơn chỉ cần một request nhỏ mà đắt: regex 30 ký tự làm máy chủ bận 20 giây, 49 KB nén giải ra 50 MB, chính cơ chế băm mật khẩu chậm trở thành vũ khí. Bốn kiểu bất đối xứng, đo thật.

Bảo mật 02/09/2026 8 phút

195 KB JSON làm sập cả tiến trình, còn giới hạn body 1 MB không cứu nổi — ba trục bùng nổ khi parse mà một cái trần không chặn hết

Kẻ tấn công parse không chỉ điều khiển kích thước dữ liệu mà cả cấu trúc của nó, và mỗi chiều đánh vào một tài nguyên khác nhau: JSON lồng sâu 100.000 cấp (195 KB) làm tràn stack, một số 100.000 chữ số đốt CPU O(n²), một mảng 5 triệu phần tử ngốn RAM. Tôi đo cả ba, và cho thấy vì sao giới hạn kích thước body — biện pháp phổ biến nhất — chỉ chặn được đúng một trục.

Bảo mật 02/09/2026 8 phút

Trang của kẻ tấn công đọc trọn số dư và số thẻ của người dùng đã đăng nhập — chỉ vì một dòng CORS 'phản chiếu Origin' trông y hệt một danh sách trắng động

CORS không phải lớp bảo mật thêm vào — nó là cơ chế nới lỏng same-origin policy, và cấu hình sai mở toang cánh cửa vốn được khoá. Tôi đo bằng Chromium thật: cấu hình phản chiếu Origin cho trang evil đọc trọn dữ liệu có credentials, trong khi '*' bị chuẩn chặn và danh sách trắng thì an toàn. Kèm một hiểu lầm cần gỡ: 'Failed to fetch' không có nghĩa request bị chặn.

Bảo mật ứng dụng web 02/09/2026 9 phút

Bắt tay TLS tốn chưa tới 1 ms và chỉ trả một lần — nên 'TLS chậm' là cớ; cái thật sự nguy là dòng CERT_NONE viết lúc dev rồi theo bài lên production

Cùng một chữ HTTPS trên thanh địa chỉ có thể là TLS 1.3 cipher 256-bit, cũng có thể là máy chủ vẫn nhận TLS 1.0 và chứng chỉ chẳng ai ký. Tôi đo thời gian bắt tay (dưới 1 ms, trả một lần), thử ép giao thức cũ (bị từ chối), và chứng minh vì sao tắt kiểm chứng chỉ là vứt bỏ chống MITM — mã hoá mà không xác minh danh tính là khoá cửa rồi đưa chìa cho người lạ.

Bảo mật 02/09/2026 9 phút

Xoá khoá API khỏi file rồi commit lại — quét lịch sử vẫn thấy nguyên nó, và cái khoá vẫn dùng được sau cả rebase lẫn force-push

Phản xạ khi lỡ commit một khoá là xoá dòng, commit lại, thở phào. Tôi đo hai điều cái thở phào bỏ qua: xoá khỏi file không xoá khỏi lịch sử git (quét working-tree 0, quét lịch sử 2), và viết lại lịch sử không vô hiệu credential — token vẫn sống qua rebase/force-push, chỉ chết khi xoay vòng. Lỡ lộ thì xoay vòng trước, dọn git sau.

Bảo mật 02/09/2026 9 phút

Bốn chỗ để một bí mật, xếp theo 'ai đọc được': hardcode lộ cho cả lịch sử git, còn biến môi trường thì mọi tiến trình con và /proc đều thấy

Để bí mật ở đâu cho đúng? Tôi đo bốn cách bằng một câu hỏi kiểm chứng được — ai đọc được nó — chứ không xếp thang cảm tính: hardcode (cả repo + lịch sử), biến môi trường (con thừa kế, /proc/environ, docker inspect), .env (an toàn đúng bằng quyền file), và file 400 trên tmpfs (hẹp nhất). Kèm một lần tôi đo sai /proc suýt kết luận biến môi trường kín.