A deeper dive into our May 2019 security incident

Bài tóm tắt Stack Overflow 2021 3. Quy mô lớn Độ khó: Trung bình

Stack Overflow · 2021 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Ngày 12/5/2019, cộng đồng báo một tài khoản lạ có quyền moderator và developer trên toàn mạng Stack Exchange. Điều tra cho thấy đó chỉ là phần nổi: kẻ tấn công đã lấy được mã nguồn và làm lộ thông tin cá nhân của 184 user; không DB nào bị lấy ra.
  • Truy vết được nhờ một DB ghi lại toàn bộ traffic vào các site công khai: từ ID tài khoản lần ra IP và dấu vết khác, dựng lại hành trình từ 30/4.

Chuỗi tấn công (12 ngày)

  • Dò hạ tầng build, source control, môi trường dev; thử xin mã nguồn qua ticket hỗ trợ giả làm khách Enterprise (bị từ chối); dùng URL repo GitHub Enterprise vô tình lộ trong một repo mã nguồn mở.
  • Vào được tầng dev qua một đường đăng nhập thiếu kiểm tra access key. Tầng dev cho phép giả danh mọi user để test, nên leo lên quyền Community Manager; dùng một route trên dev hiển thị nội dung email để lấy magic link khôi phục tài khoản developer.
  • Trong site settings của dev có credential của một service account TeamCity: chức năng dùng nó đã bỏ từ lâu nhưng credential vẫn còn hiệu lực. TeamCity mở ra Internet, và do một cấu hình nhóm mặc định sai từ nhiều năm, user mới nhận ngay quyền admin.
  • Trang chẩn đoán của TeamCity cho duyệt file hệ thống, nơi có SSH key dạng plaintext mà build agent dùng để kéo code từ GitHub Enterprise; trong vài phút đã clone nhiều repo chính, kèm script dựng môi trường và wiki vận hành.
  • Thử đăng nhập GitHub và VPN bằng service account thì thất bại (2FA; service account không được dùng VPN). Ngày 11/5, tạo một project trong TeamCity, tắt versioned settings, đổi mapping tên người dùng để che audit log, rồi chạy một SQL migration lên DB production để nâng quyền trên toàn mạng; xoá build để phi tang (Stack Overflow khôi phục được nhờ "thùng rác" cấu hình).
  • Một chi tiết: kẻ tấn công liên tục tra Stack Overflow về cách dùng TeamCity, IIS, .NET, nên chính traffic log giúp đoán được bước tiếp theo.

Phản ứng

  • Thu hồi quyền và credential, tắt TeamCity, bỏ các đường leo thang trên dev. Phát hiện muộn hơn hai ngày rằng SSH key của build server đã bị dùng ngoài mạng: thu hồi, đưa GitHub ra sau firewall, kiểm commit lạ (không có), xoay vòng mọi secret lộ ra, thuê bên ngoài kiểm lại phương pháp điều tra.

Thay đổi sau sự cố

  • Ngắn hạn: build và source control ra sau firewall (cần VPN; trước để mở vì phần lớn kỹ sư làm từ xa); bỏ nhóm mặc định trong TeamCity; gỡ secret khỏi source code, xoay vòng, đưa vào build system hoặc runtime, secret chỉ ghi không đọc; alert khi có ai được nâng lên quyền developer; tầng dev vẫn phải mở Internet (nhận webhook) nhưng giả danh chỉ được hạ quyền.
  • Dài hạn: thay VPN bằng hệ bắt buộc 2FA và phân vùng theo vai trò; chuyển từ secret tiêm lúc build sang kho secret lúc chạy; tách build khỏi deploy (GitHub Actions tạo artifact, Octopus Deploy triển khai) thay cho TeamCity vừa build vừa deploy; SSO + 2FA cho dịch vụ bên thứ ba; công cụ hiểu được quyền sinh ra từ nhiều năm lồng nhóm.

Bài học cho SWE (theo Stack Overflow)

  • Log toàn bộ traffic vào: không log thì không điều tra được.
  • Hệ thống cuối cùng còn xác thực kiểu cũ (không 2FA) là lỗ hổng lớn nhất.
  • "Secret không chỉ là mật khẩu": SSH key, chuỗi kết nối DB cũng vậy; credential của tính năng đã bỏ phải bị thu hồi.
  • Tính năng tiện cho test (giả danh, xem email) trên môi trường có dữ liệu thật là đường leo thang.
  • Build server có quyền ghi vào production là tài sản giá trị nhất để chiếm.

Liên quan