TL;DR — Vụ Vercel breach bắt đầu khi OAuth token của Context.ai bị đánh cắp qua malware Lumma Stealer. Attacker truy cập Google Workspace của nhân viên Vercel, rồi xâm nhập hệ thống nội bộ. Nếu bạn đang dùng Cursor, Claude Code, v0, hay bất kỳ AI tool nào kết nối tài khoản, bạn có cùng attack surface. Đây là cách audit trong 5 phút. Nhảy đến hướng dẫn audit →
📊 Bài này cover:
- OAuth supply chain attack khác npm supply chain attack như thế nào
- Toàn bộ attack chain Vercel/Context.ai, từng bước
- Audit OAuth trong 5 phút cho Google, GitHub, Slack, Notion, npm
- Scope hygiene giúp giảm blast radius của vụ Vercel xuống gần zero
- Playbook response 1 giờ khi vendor bị breach
Tôi chạy audit Google account tuần trước. 23 OAuth app đang kết nối. Ba cái là AI tool tôi quên đã authorize. Một cái có full Drive access. Đây là vụ breach khiến tôi phải kiểm tra:
Attacker → Lumma Stealer malware trên máy nhân viên Context.ai → Đánh cắp OAuth token Google Workspace của Context.ai → Truy cập Google Workspace nhân viên Vercel (email, Drive, calendar) → Pivot vào hệ thống nội bộ Vercel → 580 bản ghi nhân viên bị lộ → Customer environment variables bị leak → ShinyHunters rao bán data với giá $2M trên BreachForumsNgày 19/4/2026, Vercel công bố rằng Context.ai (một AI analytics platform) đã bị compromise qua malware Lumma Stealer. Attacker không hack Vercel trực tiếp. Họ hack một AI tool mà nhân viên Vercel đã grant quyền “Allow All” OAuth. Một OAuth grant duy nhất đó cho attacker quyền truy cập toàn bộ Google Workspace của nhân viên. Từ đó, vào hệ thống nội bộ Vercel. 580 bản ghi nhân viên. Customer environment variables. $2M ransom từ ShinyHunters.
Bạn nghĩ đó là chuyện của Vercel? Không phải. Nếu bạn đã connect bất kỳ AI tool nào vào Google, GitHub, hay Slack, bạn có cùng attack surface. Đây là loại tấn công khác hoàn toàn so với npm supply chain attacks tôi đã viết trước đó. npm attack chạy code trong build pipeline. OAuth attack chiếm identity và workspace data.
Fix trong 5 phút.
OAuth supply chain attack là gì?
OAuth supply chain attack compromise OAuth token của third-party app để truy cập mọi thứ app đó được authorize: email, repo, cloud credentials. Khác với npm supply chain attack (chạy code độc trong build pipeline), OAuth attack nhắm vào identity và workspace. Attacker không cần password. Họ đã có token hợp lệ.
Đây là điểm khác biệt quan trọng:
| Loại tấn công | Cái gì bị compromise | Điểm vào | MFA có giúp? |
|---|---|---|---|
| npm supply chain | Build pipeline, máy local | Code độc trong package | N/A |
| OAuth supply chain | Identity, workspace data | OAuth token bị đánh cắp | Không |
| Credential phishing | Một account | Trang login giả | Có |
OAuth token bypass MFA. Token được cấp sau khi xác thực lần đầu. Sau đó hoạt động độc lập. Không có password prompt. Không cần second factor. Attacker có token OAuth có cùng quyền truy cập như app, cho đến khi token hết hạn.
Key insight: 30% tổng số data breach hiện nay liên quan đến third-party hoặc supply chain, tăng gấp đôi so với năm trước (SOCRadar, 2025). OAuth token theft đang tăng nhanh nhất vì nó bypass MFA và SSO mà các tổ chức đã đầu tư mạnh trong 2023-2025.
Vụ Vercel breach xảy ra như thế nào?
Một nhân viên Vercel authorize Context.ai với quyền “Allow All” Google Workspace. Context.ai sau đó bị nhiễm Lumma Stealer (một commodity infostealer bán trên dark web khoảng $250/tháng). Attacker extract OAuth token của Context.ai và dùng để truy cập Google Workspace của nhân viên Vercel, rồi pivot vào hệ thống nội bộ.
Timeline:
| Thời gian | Sự kiện |
|---|---|
| ~Tháng 2/2026 | Lumma Stealer lây nhiễm máy nhân viên Context.ai |
| T2-T3/2026 | Attacker extract OAuth token từ hệ thống Context.ai |
| Tháng 3/2026 | Attacker dùng token đánh cắp để truy cập Google Workspace nhân viên Vercel |
| 19/4/2026 | Vercel công bố security bulletin, CEO xác nhận Context.ai là vector |
| 20/4/2026 | ShinyHunters đăng bán data trên BreachForums giá $2M |
Context.ai không phải bên ác ý. Họ cũng là nạn nhân. Lỗi thực sự mang tính hệ thống: OAuth scope quá rộng (“Allow All” thay vì quyền tối thiểu) và không monitoring third-party token.
Đây không phải tấn công nation-state. Đây là commodity infostealer trên máy nhân viên startup. Cùng loại malware có trong phần mềm crack và email phishing. Rào cản thấp đến mức đáng sợ.
Key insight: Vụ Vercel breach lộ 580 bản ghi nhân viên và customer environment variables qua một OAuth token duy nhất từ AI tool bên thứ ba (TechCrunch, 4/2026). Attacker không exploit zero-day hay bypass firewall. Họ dùng token hợp lệ đã được authorize sẵn.
AI tool nào đang kết nối tài khoản của BẠN?
Trung bình mỗi tổ chức có 17 AI app integration kết nối Google và Microsoft. 98% tổ chức có nhân viên dùng AI tool không được phê duyệt. Tài khoản cá nhân bạn có thể còn tệ hơn, vì không ai audit chúng cả.
Đây là những gì AI coding tool phổ biến có thể truy cập nếu bị compromise:
| Tool | Kết nối gì | Blast radius nếu bị hack |
|---|---|---|
| Cursor | GitHub repos (read/write) | Source code, commit, secret trong code |
| Claude Code (MCP) | GitHub, Drive, Slack, DB | Phụ thuộc config MCP server |
| v0 by Vercel | Vercel account, GitHub | Deployment, env vars, source code |
| Zapier AI / n8n | Email, calendar, CRM, DB | Mọi thứ workflow chạm tới |
| Otter / Fireflies | Google Calendar, email, Drive | Meeting transcript, contacts, files |
| Notion AI | Notion workspace | Mọi page integration có quyền đọc |
Vụ Vercel breach xảy ra vì một nhân viên connect một AI tool với quyền rộng. Giờ nhân số đó với mọi AI tool mà mọi engineer trong team bạn đã authorize trong năm qua.
Shadow SaaS app tăng 25% mỗi 60 ngày. Nếu bạn chưa audit trong hai tháng, attack surface đã lớn hơn bạn nghĩ.
Key insight: Push Security phát hiện trung bình 17 AI app integration mỗi tổ chức kết nối Google và Microsoft, trong khi hầu hết tổ chức chỉ phê duyệt 1-2 AI app (Push Security, 4/2026). Khoảng cách giữa AI tool được phê duyệt và thực tế đang dùng chính là attack surface.
Làm sao audit OAuth permissions trong 5 phút?
Mở myaccount.google.com/permissions ngay. Đếm số app. Với mỗi app: bạn còn dùng không? Nó có quyền nhiều hơn cần thiết không? Nếu không trả lời được cả hai, revoke. Đây là checklist đầy đủ trên 5 platform.
1. Google Workspace
URL: myaccount.google.com/permissions
Kiểm tra mỗi app. Tìm:
- App bạn không nhận ra hoặc không dùng nhiều tháng rồi
- App có quyền “See, edit, create, and delete” Drive (đó là scope
drive, không phảidrive.file) - App có quyền Gmail (đọc được mọi email bạn từng nhận)
Revoke bất cứ app nào bạn không dùng thường xuyên. Luôn có thể re-authorize sau.
2. GitHub
URL: github.com/settings/applications
Check cả hai tab: OAuth Apps và GitHub Apps. Khác nhau. Tìm:
- App có scope
repo(full read/write tất cả repo, bao gồm private) - Classic personal access token không có expiration
- Fine-grained token có quyền nhiều repo hơn cần thiết
3. Slack
Path: Workspace settings > Manage apps > Your authorized apps
App có chat:write và channels:read có thể đọc tin nhắn và post thay bạn.
4. Notion
Path: Settings > My connections > review integrations
Kiểm tra integration nào truy cập page nào. Notion mặc định cho quyền “all pages.” Hạn chế xuống specific pages khi có thể.
5. npm
URL: npmjs.com/settings/~/tokens
Kiểm tra token bạn không tạo. Sau vụ axios compromise, attacker nhắm vào npm token để lateral movement. Nếu thấy classic token không có expiration, thay bằng granular token scoped cho package cụ thể.
Thử ngay:
- Mở
myaccount.google.com/permissionstrong tab mới- Đếm số app và revoke app bạn không nhận ra
- Revoke app nào không dùng 3 tháng
- Làm tương tự với
github.com/settings/applications(check cả hai tab OAuth Apps và GitHub Apps)- Tổng thời gian: dưới 5 phút
Scope hygiene là gì và tại sao quan trọng?
Nhân viên Vercel grant “Allow All” cho Context.ai. Nếu chỉ grant read-only cho một Drive folder, blast radius sẽ gần zero. Scope hygiene nghĩa là cho mỗi tool quyền tối thiểu cần thiết, không hơn.
“Broad” vs “narrow” scope với tên thực tế:
| Platform | Broad scope (nguy hiểm) | Narrow scope (an toàn) |
|---|---|---|
| Google Drive | drive (mọi file, read/write) | drive.file (chỉ file app tạo) |
| Gmail | gmail.modify (đọc, gửi, xóa) | gmail.readonly (chỉ đọc) |
| GitHub | Classic PAT scope repo (mọi repo) | Fine-grained token, 1 repo, read-only |
| Slack | admin (full workspace) | chat:write trên channel cụ thể |
Khi AI tool request https://www.googleapis.com/auth/drive, nó có full read/write mọi thứ bạn thấy trong Drive. Không chỉ file cá nhân. Shared drive cũng vậy. Team folder. Cái Google Doc chứa database credential ai đó share năm ngoái.
Ba quy tắc scope hygiene:
- Read-only mặc định. Hầu hết AI tool không cần write access. Nếu OAuth consent screen nói “edit” hay “delete”, hỏi tại sao.
- Scope cho resource cụ thể. GitHub fine-grained token cho chọn từng repo. Google
drive.filegiới hạn quyền chỉ cho file app tạo. Dùng chúng. - Account riêng cho AI tool. Nếu AI tool cần quyền rộng (meeting transcript, email context), dùng Google account riêng không có dữ liệu nhạy cảm.
Key insight: App request
googleapis.com/auth/drivecó full read/write mọi thứ user thấy trong Drive, không chỉ file cá nhân (Push Security, 2026). Khác biệt giữa scopedrivevàdrive.filelà khác biệt giữa “mọi thứ trong workspace” và “chỉ file app này tạo.”
Bao lâu nên rotate OAuth token?
90 ngày cho token high-privilege. Ngay lập tức khi vendor công bố breach. Tự động hóa khi có thể.
| Loại token | Chu kỳ rotate | Cách tự động |
|---|---|---|
| GitHub fine-grained PAT | 90 ngày (expiration built-in) | Set expiration khi tạo |
| GitHub classic PAT | Thay bằng fine-grained | Classic token không expire mặc định |
| Google OAuth | Hàng quý (revoke + re-authorize) | Calendar reminder hoặc Nudge Security |
| npm token | 90 ngày | npm token create với --cidr |
| Slack app token | Hàng quý | Workspace admin > Manage apps |
Sau vendor breach: revoke TẤT CẢ token của vendor đó trong 1 giờ. Không chỉ token bạn nghĩ bị compromise. Tất cả. Vụ Vercel bắt đầu với token không ai biết đang bị rủi ro cho đến khi công bố.
GitHub fine-grained token là tiêu chuẩn vàng. Expire mặc định, scope cho repo cụ thể, hỗ trợ IP restriction. Nếu vẫn dùng classic PAT, đây là lúc migrate.
Nhận tip bảo mật hàng tuần cho AI coder. Hooks, OAuth hardening, và phân tích breach thực tế. Một email mỗi tuần. Đăng ký AI Developer Weekly →
Khi vendor bị breach, làm gì trong 1 giờ?
Bạn có 1 giờ. Revoke tất cả OAuth token của vendor bị compromise. Rotate mọi secret vendor có thể đã truy cập. Check audit log. Rồi quyết định re-authorize với scope hẹp hơn hay tìm alternative.
4 bước response khẩn cấp
Bước 1: Revoke OAuth token (0-15 phút)
- Google:
myaccount.google.com/permissions> tìm app > Remove Access - Google Workspace admin: Admin console > Security > API controls > Manage Third-Party App Access
- GitHub:
github.com/settings/applications> Revoke
Bước 2: Rotate secret bị lộ (15-30 phút)
- Rotate API key, database credential, env var mà vendor có thể truy cập
- npm:
npm token revoke <id>rồinpm token create - AWS/GCP/Azure: rotate IAM key nếu vendor có cloud access
Bước 3: Check audit log (30-45 phút)
- Google Workspace: Admin console > Reports > Audit > Drive/Gmail
- GitHub: Settings > Security log > filter theo tên app
- Tìm access pattern ngoài giờ làm việc hoặc từ IP lạ
Bước 4: Post-mortem (45-60 phút)
- Quyết định: re-authorize với scope tối thiểu, hay đổi tool?
- Ghi chép vendor có quyền truy cập gì và cái gì có thể bị lộ
- Nếu bạn là team lead: viết runbook để lần sau step 1-3 chạy tự động
Dev solo: step 1-2 mất 15 phút. Team lead: bạn cần runbook sẵn TRƯỚC khi breach xảy ra. Vercel breach được công bố vào thứ Bảy. Nếu response plan cần security team mà team đang nghỉ cuối tuần, bạn đã chậm rồi.
Key insight: Third-party breach tốn trung bình gần $5 triệu mỗi vụ, thời gian phát hiện trung bình 267 ngày (IBM Cost of a Data Breach, 2025). Vụ Vercel breach không bị phát hiện khoảng hai tháng trước khi công bố. Runbook response viết sẵn cắt thời gian phơi nhiễm từ ngày xuống giờ.
Liên hệ với npm supply chain defense như thế nào?
OAuth supply chain và npm supply chain là hai mặt của cùng một vấn đề: cộng lại chiếm phần lớn các vụ compromise developer tool trong 2025-2026, với third-party involvement tăng gấp đôi mỗi năm (SOCRadar, 2025). npm attack chạy code trong build pipeline. OAuth attack chiếm identity và workspace data. Defense hoàn chỉnh phải cover cả hai.
| Layer | Attack surface | Defense | Bài viết |
|---|---|---|---|
| Level 1 | npm lifecycle scripts | ~/.npmrc hardening | npm Defense 30 Giây |
| Level 2 | npm install qua AI agent | PreToolUse hooks | Chặn npm Attack với Hooks |
| Level 3 | OAuth token cho AI tool | Audit + scope hygiene | Bài này |
Vụ Vercel breach có thể ngăn chặn ở nhiều điểm: OAuth scope hẹp hơn, audit token định kỳ, monitoring third-party access bất thường. Không cái nào cần vendor hợp tác hay thay đổi ecosystem. Tất cả đều làm được hôm nay, trên máy bạn, trong 5 phút.
Nếu bạn đang bảo vệ secret khi dùng Claude Code trên project thực, OAuth token cũng là secret. Chúng cho quyền truy cập Google Drive, GitHub repo, Slack message. Xử lý chúng nghiêm túc như API key trong .env.
Thử ngay:
- Mở ba tab:
myaccount.google.com/permissions,github.com/settings/applications, vànpmjs.com/settings/~/tokens- Revoke mọi app bạn không dùng
- Thay classic GitHub PAT bằng fine-grained token scope cho repo cụ thể
- Đặt calendar reminder 90 ngày để lặp lại audit
Muốn biết khi AI tool tiếp theo bị breach? Một email mỗi tuần, focus bảo mật. Tham gia AI Developer Weekly →
FAQ
OAuth token có bypass được MFA không?
Có. OAuth token được cấp sau khi xác thực lần đầu. Sau đó hoạt động độc lập. Attacker có token OAuth không cần password hay second factor. Đây là thiết kế: OAuth tách authorization khỏi authentication. Token chứng minh app đã được authorize, không phải user hiện tại đang authenticated.
Revoke OAuth app có giống xóa tài khoản không?
Không. Revoke gỡ quyền app truy cập data Google/GitHub/Slack. Tài khoản trên app đó (và data lưu trên server) vẫn còn. Bạn nên xóa tài khoản riêng nếu vendor bị compromise và có thể đã lưu data của bạn.
Làm sao biết AI tool bị hack?
Thường thì không biết, cho đến khi vendor công bố. Monitor status page và đăng ký security bulletin. Check Google Workspace audit log (Admin console > Reports > Audit) để phát hiện truy cập bất thường từ third-party. Push Security và Nudge Security tự động hóa monitoring cho team. Cá nhân thì audit thủ công hàng quý là mức tối thiểu thực tế.
Có nên dùng Google account riêng cho AI tool?
Có, nếu bạn connect AI tool cần quyền Google Workspace. Dùng tài khoản riêng không có Drive nhạy cảm, email quan trọng, hay quyền admin. Giới hạn blast radius vào account cách ly đó. Nếu Context.ai connect vào Google account sandbox thay vì workspace chính của nhân viên Vercel, vụ breach sẽ không lộ gì có giá trị.
Đọc tiếp
- npm Defense 30 Giây Cho Mọi Vibe Coder — Level 1 của supply chain defense series. Bốn dòng trong
~/.npmrcchặn 80% npm attack. Cùng triết lý defense 5 phút, attack surface khác. - Bảo Vệ Code Nhạy Cảm Khi Dùng Claude Code Trên Project Thực — Bốn chiến lược giữ secret khỏi AI tool context, bao gồm
.claudeignorevà git worktree isolation. OAuth token cũng là secret. - 3 Lớp Defense Trong Claude Code. Nó Vẫn Xóa File. — Bài học về layered-defense failure mode. Test threat model thực tế, không phải scenario tưởng tượng. Áp dụng cho OAuth scope configuration.