Autoswagger: Tự động hóa phát hiện Endpoint không bảo mật từ Swagger

Ở hầu hết các hệ thống backend mình từng làm, Swagger/OpenAPI gần như là “mặc định phải có”. Nó giúp frontend làm việc nhanh, QA test thuận tiện, dev mới vào team không cần hỏi quá nhiều. Nhìn vào Swagger, ai cũng có cảm giác API đã được tổ chức bài bản và an toàn.

Nhưng vấn đề nằm ở chỗ: Swagger chỉ mô tả API, chứ không đảm bảo API đang thực sự được bảo vệ đúng như mô tả.

Trong thực tế, mình đã gặp không ít tình huống như:

  • Một endpoint export dữ liệu chỉ dùng nội bộ, dev quên gắn auth
  • Router con không kế thừa middleware từ router cha
  • Swagger public vì “cho tiện dev”, nhưng không ai kiểm tra xem người ngoài gọi được gì

Những lỗi này không nằm ở logic phức tạp, mà nằm ở sự chủ quan. Và nếu không có công cụ hoặc quy trình kiểm tra, chúng rất dễ bị bỏ sót.

Hôm này mình giới thiệu về Autoswagger, công cụ khiến mình chú ý vì nó không cố giải quyết bảo mật API nói chung, mà đánh thẳng vào đúng điểm mù này.

019b46f5-8436-7105-90cf-84c6b61069dd

Autoswagger là gì và vì sao mình quan tâm?

Khi mới tò mò qua repo Autoswagger, mình không xem nó như một security scanner đâu. Cách mình hiểu nó đơn giản hơn là Autoswagger là một tool CLI nhỏ gọn, dùng OpenAPI/Swagger làm đầu vào để kiểm tra xem API có endpoint nào trả dữ liệu khi không có auth hay không.

Và để trả lời câu đó, Autoswagger làm theo một pipeline rất hợp lý:

  • Tự tìm OpenAPI/Swagger spec
  • Parse spec để lấy endpoint + schema
  • Generate request “đúng schema”
  • Gửi request không kèm auth rồi phân tích response

Điểm khiến mình thấy Autoswagger khác bọt nằm ở chỗ này: đa phần tool kiểu fuzz hoặc scan API thường die ở chỗ request không hợp lệ -> toàn 400/422 -> nhìn tưởng như an toàn. Ngược lại, Autoswagger tận dụng OpenAPI để xây dựng request hợp lệ nhất có thể. Điều này giúp nó vượt qua lớp bảo vệ ban đầu để kích hoạt logic xử lý bên trong, từ đó tăng khả năng phát hiện lỗ hổng và truy xuất dữ liệu nhạy cảm

Setup nhanh

Setup Autoswagger khá gọn. Mình clone repo và cài dependency như sau:

git clone https://github.com/intruder-io/autoswagger
cd autoswagger
pip install -r requirements.txt

Không cần config file, không cần token, không cần account. Chỉ cần Python là chạy được.

Nhìn vào dependency, có thể thấy Autoswagger không chỉ quan tâm endpoint trả về mã gì, mà còn chuẩn bị sẵn để đọc nội dung response, đặc biệt là phát hiện dữ liệu nhạy cảm như email, số điện thoại.

Sử dụng

Mình mô tả một kịch bản rất giống khi làm nội bộ: có một hệ thống API (staging) mà team tin là đã chặn auth ổn. Swagger UI lại đang để public cho tiện dev. Và nhiệm vụ của mình là: rá soát nhanh xem có endpoint nào đang public dự kiến không.

Giả sử base URL là:

https://api.example.internal

Mình chạy bản cơ bản trước:

python autoswagger.py https://api.example.internal

Điều mình quan tâm lúc này không phải tốc độ, mà là tool có tự tìm ra được OpenAPI spec hay không. Thực tế, rất nhiều hệ thống không để file swagger.json ở chỗ dễ tìm, mà giấu trong các đường dẫn con của Swagger UI. Nếu Autoswagger tự dò ra được file này thì coi như đã qua được màn quan trọng nhất.

Lọc kết quả

Khi kiểm tra thực tế, bạn không muốn mất thời gian nhìn vào hàng trăm dòng lỗi (400 hoặc 404). Mình chỉ muốn tập trung vào những thứ có vấn đề, nên thường xuất kết quả ra file JSON để review:

python autoswagger.py https://api.example.internal -json

Hoặc dùng lệnh này để lọc kết quả :

python autoswagger.py https://api.example.internal -product

Thực tế là: Dữ liệu trả về thì nhiều, nhưng thời gian để đọc thì ít.

Khi tool chỉ ra endpoint đáng nghi

Nếu Autoswagger trả về một kết quả kiểu như:

{
  "method": "GET",
  "path": "/v1/users/export",
  "status_code": 200,
  "content_length": 812344,
  "pii_detected": true
}

Mình hơi nghi ngờ. Nên việc đầu tiên luôn là confirm thủ công:

curl -i "https://api.example.internal/v1/users/export"

Nếu đúng là không auth mà vẫn trả data, lúc đó mình mới bắt đầu đào sâu nguyên nhân.

Bật chế độ Brute để kiểm tra dữ liệu

Có những endpoint nhìn qua tưởng là an toàn (trả về lỗi 400 – Bad Request) nhưng thực ra là do mình gửi thiếu tham số.

Khi nghi ngờ, mình bật chế độ Brute force để tool tự động điền các giá trị đúng chuẩn vào request:

python autoswagger.py https://api.example.internal -b

Thực tế, brute mode giúp lộ ra khá nhiều endpoint tưởng là chặn nhưng chỉ chặn hời hợt.

Kiểm soát tốc độ để an toàn cho hệ thống

Mình luôn giới hạn tốc độ gửi request để tránh làm ảnh hưởng đến server:

python autoswagger.py https://api.example.internal -rate 10

Mục tiêu là rà soát kỹ càng, ổn định chứ không phải bắn request cho nhanh.

Đánh giá sau trải nghiệm

Điểm cộng

  • Request đúng schema: Tool tạo request dựa trên tài liệu OpenAPI nên đúng định dạng, giảm bớt việc báo lỗi sai.
  • Tự tìm Swagger: Khả năng lần mò từ giao diện Swagger UI ra file cấu hình rất thực tế.
  • Hỗ trợ phân loại tốt: Ưu tiên hiện các kết quả có dữ liệu lớn, có thông tin nhạy cảm (PII), dữ liệu thật.

Điểm trừ

  • Chưa kiểm tra phân quyền sâu: Không tự test được lỗi phân quyền người dùng
  • Phụ thuộc chất lượng OpenAPI: Nếu file OpenAPI viết sai hoặc thiếu, tool cũng sẽ hoạt động không hiệu quả.
  • Kết quả cần confirm thủ công: Kết quả cuối cùng luôn cần xác nhận lại.

Kết luận

Swagger giúp chúng ta phát triển nhanh hơn, nhưng cũng dễ khiến chúng ta chủ quan. Autoswagger không làm gì phức tạp, nó chỉ buộc bạn kiểm tra lại một điều rất cơ bản: khi không có auth, API của bạn còn lộ ra gì không?

Thông tin nổi bật

Sự kiện phát trực tiếp​

Event Thumbnail

Báo cáo quan trọng

Article Thumbnail
Article Thumbnail
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Tiêu điểm chuyên gia