Có người báo lỗ hổng cho bạn: security.txt và cách trả lời
Người tìm ra lỗ hổng trong app của bạn cần biết báo cho ai. Cách tạo file security.txt theo RFC 9116, hộp thư nhận báo, cam kết thời gian phản hồi, cảm ơn công khai, phân biệt báo cáo thật với email đòi tiền, và khi nào nên thuê đánh giá độc lập.
Một người dùng app của bạn tò mò mở DevTools, thấy API trả về cả số điện thoại của người khác. Họ muốn báo cho bạn. Họ vào trang web, không thấy email liên hệ nào ngoài form “Góp ý”. Nhắn fanpage thì ba ngày chưa ai trả lời. Đến lúc đó họ có ba lựa chọn: bỏ qua, đăng lên group cho mọi người biết, hoặc tệ hơn, kể cho người không tử tế.
Bạn không kiểm soát được việc người khác tìm ra lỗi. Bạn kiểm soát được việc họ báo cho ai, và bạn trả lời thế nào.
security.txt: một file, năm phút
RFC 9116 định nghĩa một file văn bản đặt ở https://ten-mien/.well-known/security.txt, nói cho người tìm ra lỗi biết cách liên hệ. Hai trường bắt buộc là Contact (ít nhất một) và Expires (đúng một). RFC khuyên đặt Expires không quá một năm, để file không bị bỏ quên với thông tin cũ.
Các trường còn lại là tùy chọn: Encryption (khóa PGP nếu bạn muốn nhận báo mã hóa), Policy, Acknowledgments, Preferred-Languages, Canonical, Hiring. File phải phục vụ qua HTTPS, kiểu text/plain với UTF-8. Chữ ký OpenPGP được khuyên dùng nhưng không bắt buộc.
Cách đặt file:
Next.js: tạo public/.well-known/security.txt.
Astro, Vite, trang tĩnh: cũng thư mục public/.
Nginx: location = /.well-known/security.txt { alias /var/www/security.txt; default_type text/plain; }
App nhiều tên miền (app., api., admin.): mỗi tên miền một file, hoặc trỏ Canonical về một chỗ.
Đặt nhắc lịch trước ngày Expires một tháng để cập nhật. File hết hạn trông như một dự án bị bỏ hoang.
Hộp thư nhận báo
Tạo security@ riêng, chuyển tiếp cho ít nhất hai người. Một người đi nghỉ thì người kia vẫn thấy.
Kiểm tra bộ lọc thư rác. Báo cáo lỗ hổng thường có đường link lạ, đoạn code, tệp đính kèm, đúng những thứ bộ lọc hay chặn.
Với dự án mã nguồn mở trên GitHub, bật Private vulnerability reporting trong phần Security của repo để người báo không phải mở issue công khai.
Trang chính sách: viết ngắn, viết rõ
Trang Policy không cần dài. OWASP gợi ý những điểm sau, và với app nhỏ thì vài đoạn là đủ:
Phạm vi: tên miền, app nào được thử. Hệ thống của bên thứ ba (Supabase, Stripe, Vercel) không thuộc phạm vi, báo cho họ.
Điều không được làm: không truy cập, sửa, xóa dữ liệu của người khác quá mức cần để chứng minh lỗi; không DDoS; không lừa đảo nhân viên.
Cam kết của bạn: phản hồi trong bao lâu, sẽ cập nhật tiến độ, và không có ý định khởi kiện người báo cáo thiện chí làm đúng chính sách. OWASP khuyên không đe dọa pháp lý người báo, và nên hỏi ý kiến luật sư khi viết phần cam kết này.
Cảm ơn: ghi tên trên trang cảm ơn nếu người báo đồng ý. Có thưởng tiền hay không thì nói rõ.
Khi nhận được báo cáo
Một quy trình đủ dùng cho team nhỏ:
Trả lời trong 1 đến 2 ngày làm việc, kể cả chỉ để nói “đã nhận, đang xem”. Đây là bước quan trọng nhất. Người báo im lặng chờ lâu là lý do số một khiến họ công khai sớm.
Xác minh: tái hiện lỗi trên môi trường của bạn. Không tái hiện được thì hỏi thêm, đừng đóng ngay.
Đánh giá mức độ: lộ dữ liệu người khác, chiếm tài khoản, chạy lệnh trên server là nghiêm trọng; thiếu một header là thấp.
Sửa, rồi báo lại cho người báo thử lại nếu họ muốn.
Kiểm xem đã có ai khai thác chưa: xem log quanh endpoint bị lỗi. Nếu dữ liệu cá nhân đã bị lộ, nghĩa vụ thông báo cho cơ quan chức năng có thể đã bắt đầu tính giờ.
Công bố và cảm ơn: một ghi chú trong changelog hay trang bảo mật, có tên người báo nếu họ muốn.
Về thời gian sửa, OWASP nêu mốc 90 ngày là chuẩn phổ biến, ví dụ chính sách của Project Zero (Google) cho bên bị báo 90 ngày để vá, lỗi đang bị khai thác thì hạn ngắn hơn. Với app web tự làm, lỗi lộ dữ liệu thường nên sửa trong vài ngày, không phải vài tháng.
Báo cáo thật và email đòi tiền
Có một kiểu email gửi hàng loạt: “Tôi tìm thấy lỗ hổng nghiêm trọng trên trang của bạn, bạn có chương trình bug bounty không?”, kèm ảnh chụp kết quả quét tự động cho thấy thiếu một header hay bản ghi DMARC. Người ta hay gọi là “beg bounty”.
Cách phân biệt: báo cáo thật nói cụ thể endpoint nào, các bước tái hiện, dữ liệu gì bị lộ. Email đòi tiền chung chung và hỏi về tiền trước khi nói lỗi gì. Cả hai trường hợp, trả lời lịch sự, cảm ơn, và làm đúng chính sách bạn đã công bố. Thiếu header thì vẫn nên thêm, chỉ là không cần trả tiền.
Đừng trả tiền để người lạ “không công bố”. Đó không còn là báo lỗi.
Khi nào nên thuê đánh giá độc lập
security.txt giúp bạn nhận được lỗi người khác tình cờ thấy. Nó không thay được việc chủ động tìm. Nên cân nhắc thuê một bên đánh giá (pentest) khi:
app bắt đầu giữ dữ liệu nhạy cảm: sức khỏe, tài chính, giấy tờ tùy thân, vị trí;
có khách hàng doanh nghiệp yêu cầu báo cáo bảo mật trước khi ký hợp đồng;
sắp ra mắt chức năng lớn như thanh toán, nhiều tổ chức trong một app, API mở cho bên ngoài;
đã sửa một lỗi nghiêm trọng và muốn chắc không còn lỗi cùng loại.
Trước khi thuê, tự làm một vòng: chạy các bước “kiểm tra app của bạn” trong các bài trên blog này cho phân quyền, đăng nhập, upload, webhook. Bên đánh giá sẽ dùng thời gian của họ cho những thứ khó hơn.
Kiểm tra app của bạn trong vài phút
Mở https://ten-mien-cua-ban/.well-known/security.txt. Ra 404 là chưa có.
Tạo file theo mẫu ở trên, deploy, mở lại kiểm tra header Content-Type: text/plain.
Gửi thử một email tới security@ từ một địa chỉ ngoài, xem nó đến tay ai, có vào thư rác không.
Viết trang chính sách ngắn, gắn link vào trường Policy.
Đặt nhắc lịch cập nhật Expires.
App của bạn đã từng nhận được báo cáo lỗ hổng nào chưa, và bạn trả lời ra sao? Vào cộng đồng Vibe Code & Bảo Mật kể cho mọi người nghe nhé.
vận hànhlỗ hổngquy trình/anh/web/co-nguoi-bao-lo-hong-security-txt-480.webpvận hành · lỗ hổng · quy trình
Co nguoi bao lo hong cho ban: security.txt va cach tra loi Nguoi tim ra lo hong trong app cua ban can biet bao cho ai. Cach tao file security.txt theo RFC 9116, hop thu nhan bao, cam ket thoi gian phan hoi, cam on cong khai, phan biet bao cao that voi email doi tien, va khi nao nen thue danh gia doc lap. van hanh lo hong quy trinh Mot nguoi dung app cua ban to mo mo DevTools, thay API tra ve ca so dien thoai cua nguoi khac. Ho muon bao cho ban. Ho vao trang web, khong thay email lien he nao ngoai form "Gop y". Nhan fanpage thi ba ngay chua ai tra loi. Den luc do ho co ba lua chon: bo qua, dang len group cho moi nguoi biet, hoac te hon, ke cho nguoi khong tu te.

Ban khong kiem soat duoc viec nguoi khac tim ra loi. Ban kiem soat duoc viec ho bao cho ai, va ban tra loi the nao.
## security.txt: mot file, nam phut
RFC 9116 dinh nghia mot file van ban dat o `https://ten-mien/.well-known/security.txt`, noi cho nguoi tim ra loi biet cach lien he. Hai truong bat buoc la `Contact` (it nhat mot) va `Expires` (dung mot). RFC khuyen dat `Expires` khong qua mot nam, de file khong bi bo quen voi thong tin cu.
```
Contact: mailto:security@app-cua-ban.com
Contact: https://app-cua-ban.com/bao-lo-hong
Expires: 2027-10-01T00:00:00.000Z
Preferred-Languages: vi, en
Policy: https://app-cua-ban.com/bao-lo-hong
Acknowledgments: https://app-cua-ban.com/cam-on
Canonical: https://app-cua-ban.com/.well-known/security.txt
```
Cac truong con lai la tuy chon: `Encryption` (khoa PGP neu ban muon nhan bao ma hoa), `Policy`, `Acknowledgments`, `Preferred-Languages`, `Canonical`, `Hiring`. File phai phuc vu qua HTTPS, kieu `text/plain` voi UTF-8. Chu ky OpenPGP duoc khuyen dung nhung khong bat buoc.
Cach dat file:
- **Next.js**: tao `public/.well-known/security.txt`.
- **Astro, Vite, trang tinh**: cung thu muc `public/`.
- **Nginx**: `location = /.well-known/security.txt { alias /var/www/security.txt; default_type text/plain; }`
- **App nhieu ten mien** (`app.`, `api.`, `admin.`): moi ten mien mot file, hoac tro `Canonical` ve mot cho.
Dat nhac lich truoc ngay `Expires` mot thang de cap nhat. File het han trong nhu mot du an bi bo hoang.
## Hop thu nhan bao
- Tao `security@` rieng, chuyen tiep cho it nhat hai nguoi. Mot nguoi di nghi thi nguoi kia van thay.
- Kiem tra bo loc thu rac. Bao cao lo hong thuong co duong link la, doan code, tep dinh kem, dung nhung thu bo loc hay chan.
- Voi du an ma nguon mo tren GitHub, bat **Private vulnerability reporting** trong phan Security cua repo de nguoi bao khong phai mo issue cong khai.
## Trang chinh sach: viet ngan, viet ro
Trang `Policy` khong can dai. OWASP goi y nhung diem sau, va voi app nho thi vai doan la du:
- **Pham vi**: ten mien, app nao duoc thu. He thong cua ben thu ba (Supabase, Stripe, Vercel) khong thuoc pham vi, bao cho ho.
- **Dieu khong duoc lam**: khong truy cap, sua, xoa du lieu cua nguoi khac qua muc can de chung minh loi; khong DDoS; khong lua dao nhan vien.
- **Cam ket cua ban**: phan hoi trong bao lau, se cap nhat tien do, va khong co y dinh khoi kien nguoi bao cao thien chi lam dung chinh sach. OWASP khuyen khong de doa phap ly nguoi bao, va nen hoi y kien luat su khi viet phan cam ket nay.
- **Cam on**: ghi ten tren trang cam on neu nguoi bao dong y. Co thuong tien hay khong thi noi ro.
## Khi nhan duoc bao cao
Mot quy trinh du dung cho team nho:
1. **Tra loi trong 1 den 2 ngay lam viec**, ke ca chi de noi "da nhan, dang xem". Day la buoc quan trong nhat. Nguoi bao im lang cho lau la ly do so mot khien ho cong khai som.
2. **Xac minh**: tai hien loi tren moi truong cua ban. Khong tai hien duoc thi hoi them, dung dong ngay.
3. **Danh gia muc do**: lo du lieu nguoi khac, chiem tai khoan, chay lenh tren server la nghiem trong; thieu mot header la thap.
4. **Sua, roi bao lai** cho nguoi bao thu lai neu ho muon.
5. **Kiem xem da co ai khai thac chua**: xem log quanh endpoint bi loi. Neu du lieu ca nhan da bi lo, nghia vu thong bao cho co quan chuc nang co the da bat dau tinh gio.
6. **Cong bo va cam on**: mot ghi chu trong changelog hay trang bao mat, co ten nguoi bao neu ho muon.
Ve thoi gian sua, OWASP neu moc 90 ngay la chuan pho bien, vi du chinh sach cua Project Zero (Google) cho ben bi bao 90 ngay de va, loi dang bi khai thac thi han ngan hon. Voi app web tu lam, loi lo du lieu thuong nen sua trong vai ngay, khong phai vai thang.
## Bao cao that va email doi tien
Co mot kieu email gui hang loat: "Toi tim thay lo hong nghiem trong tren trang cua ban, ban co chuong trinh bug bounty khong?", kem anh chup ket qua quet tu dong cho thay thieu mot header hay ban ghi DMARC. Nguoi ta hay goi la "beg bounty".
Cach phan biet: bao cao that noi cu the endpoint nao, cac buoc tai hien, du lieu gi bi lo. Email doi tien chung chung va hoi ve tien truoc khi noi loi gi. Ca hai truong hop, tra loi lich su, cam on, va lam dung chinh sach ban da cong bo. Thieu header thi van nen them, chi la khong can tra tien.
Dung tra tien de nguoi la "khong cong bo". Do khong con la bao loi.
## Khi nao nen thue danh gia doc lap
security.txt giup ban nhan duoc loi nguoi khac tinh co thay. No khong thay duoc viec chu dong tim. Nen can nhac thue mot ben danh gia (pentest) khi:
- app bat dau giu du lieu nhay cam: suc khoe, tai chinh, giay to tuy than, vi tri;
- co khach hang doanh nghiep yeu cau bao cao bao mat truoc khi ky hop dong;
- sap ra mat chuc nang lon nhu thanh toan, nhieu to chuc trong mot app, API mo cho ben ngoai;
- da sua mot loi nghiem trong va muon chac khong con loi cung loai.
Truoc khi thue, tu lam mot vong: chay cac buoc "kiem tra app cua ban" trong cac bai tren blog nay cho phan quyen, dang nhap, upload, webhook. Ben danh gia se dung thoi gian cua ho cho nhung thu kho hon.
## Kiem tra app cua ban trong vai phut
1. Mo `https://ten-mien-cua-ban/.well-known/security.txt`. Ra `404` la chua co.
2. Tao file theo mau o tren, deploy, mo lai kiem tra header `Content-Type: text/plain`.
3. Gui thu mot email toi `security@` tu mot dia chi ngoai, xem no den tay ai, co vao thu rac khong.
4. Viet trang chinh sach ngan, gan link vao truong `Policy`.
5. Dat nhac lich cap nhat `Expires`.
---
App cua ban da tung nhan duoc bao cao lo hong nao chua, va ban tra loi ra sao? Vao [cong dong Vibe Code & Bao Mat](https://www.facebook.com/groups/1867387324580254) ke cho moi nguoi nghe nhe.
## Nguon
- [RFC 9116: A File Format to Aid in Security Vulnerability Disclosure](https://www.rfc-editor.org/rfc/rfc9116.html), IETF
- [Vulnerability Disclosure Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Vulnerability_Disclosure_Cheat_Sheet.html), OWASP
- [Privately reporting a security vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability), GitHub Docs