Con số biết nói
Nghiên cứu của Palo Alto Networks Unit 42 (2026) audit hơn 5,600 app build bằng AI coding tools. Kết quả không vui:
- 2,000+ lỗ hổng bảo mật được tìm thấy
- 45% app chứa ít nhất 1 lỗi trong OWASP Top 10
- 53% code AI sinh ra thất bại ở security review sau khi đã ship
- 86% thiếu protection chống XSS - tệ hơn human code 2.74 lần
35 CVE mới được ghi nhận chỉ trong tháng 3/2026, tất cả đều trace về AI-generated code.
Các bạn đọc lại đi: 35 CVE trong một tháng.
Tại sao AI lại kém security?
Tôi đã quan sát khá nhiều khi làm việc với các AI coding tools, và tôi rút ra được 3 lý do cốt lõi:
1. AI optimize cho "code chạy được", không phải "code an toàn"
AI được train để generate code pass test và compile được. Nó không được train để "suy nghĩ như attacker". Khi bạn nói "build tôi một login endpoint", AI sẽ build một endpoint login. Nó sẽ không tự hỏi: nếu user brute-force thì sao? Rate limiting ở đâu? Nếu SQL injection thì sao?
Không phải AI ngu - mà là nó không được hỏi.
2. Training data có bias về convenience
Phần lớn code trên GitHub, Stack Overflow, blog post... là code ví dụ, tutorial, "quick solution". Security thường bị bỏ qua trong tutorial vì nó "làm phức tạp ví dụ". AI học từ data đó, nên AI cũng có xu hướng bỏ qua security controls.
3. AI không hiểu business context
Authorization bypass xảy ra khi AI không biết rule: "User A không được phép đọc data của User B" - dù rule đó hiển nhiên với developer có kinh nghiệm. AI cần được nói rõ từng business rule. Nếu bạn không nói, AI sẽ không tự đặt ra rule đó.
5 loại lỗ hổng phổ biến nhất trong vibe-coded apps
1. Missing authorization (phổ biến nhất)
Anh bạn tôi ở đầu bài gặp case này. AI generate API endpoint nhưng không enforce "user chỉ được đọc data của mình". Trong Supabase, nếu không bật RLS, mặc định mọi user đều có full access.
-- AI hay quên bước này:
ALTER TABLE user_data ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can only see own data" ON user_data
FOR ALL USING (auth.uid() = user_id);
Một trường hợp thực tế: app Moltbook bị expose 1.5 triệu API tokens vì thiếu RLS. Không phải dev thiếu kinh nghiệm - dev chỉ copy AI output mà không verify.
2. Hardcoded credentials
AI rất hay nhét API keys, database credentials thẳng vào code. Đặc biệt khi bạn paste error message có context vào prompt - AI sẽ suggest code với credentials thật của bạn.
// AI generated - đừng bao giờ làm vậy:
const client = new SomeService({
apiKey: "sk-1234567890abcdef", // key thật từ error context
database: "postgresql://admin:p@ss@prod.server.com/db"
});
Tôi đã thấy cả team push thẳng kiểu này lên GitHub vì "AI suggest thì mình copy thôi".
3. SQL Injection trong dynamic queries
AI biết dùng parameterized queries - nhưng không phải lúc nào cũng dùng, đặc biệt khi generate complex dynamic queries.
// AI có thể generate kiểu này khi query phức tạp:
var query = $"SELECT * FROM products WHERE name LIKE '%{searchTerm}%'";
// Đúng phải là:
var query = "SELECT * FROM products WHERE name LIKE @searchTerm";
command.Parameters.AddWithValue("@searchTerm", $"%{searchTerm}%");
4. Sensitive data leak ra client-side
AI khi build Next.js, React app thường vô tình đưa sensitive data vào client bundle - database structure, internal error messages, server-side environment variables.
// AI hay sinh ra kiểu này (SAI):
export async function getServerSideProps() {
return {
props: {
dbConnectionString: process.env.DATABASE_URL, // NEVER
internalUserId: user.internalId,
adminFlag: user.isAdmin // Đừng bao giờ
}
}
}
Một app trên Lovable bị report database credentials visible thẳng trong browser DevTools. User mở F12 là thấy.
5. Missing rate limiting và brute force protection
Login endpoint không có rate limiting. Password reset không có expiry. OTP không có attempt limit. AI không tự thêm các thứ này trừ khi bạn explicitly yêu cầu - và phần lớn developer vibe coding không yêu cầu.
Checklist thực tế tôi đang dùng
Sau một số "bài học đắt giá" (cả của mình lẫn của team), tôi có workflow này:
Trong lúc prompt AI - thêm security context:
Thay vì: "Build me a user profile endpoint"
Viết: "Build me a user profile endpoint. Requirements: user can only access their own profile, apply rate limiting 100 req/min, return only necessary fields - no password hash, no internal IDs, no admin flags"
Và sau khi AI sinh ra code, hỏi tiếp:
"Review this code for OWASP Top 10 vulnerabilities. List any issues found."
AI tự review code của chính nó - và thường tìm ra được 1-2 thứ nó vừa bỏ sót :D
Trước khi commit:
- Grep for hardcoded secrets:
git diff --staged | grep -iE "(api_key|password|secret|token)\s*[=:]\s*['\"]"
- Check environment variables: không có
process.env.XXXnào leak ra client bundle - Authorization check: mọi endpoint trả user data đều có ownership check
- Input validation: mọi input từ user đều được validate trước khi query DB
Trước khi push lên production:
- Run SAST tool - Semgrep free tier là đủ dùng cho hầu hết projects
- Check dependencies:
npm audithoặcdotnet list package --vulnerable - Manual review các file liên quan đến auth, payment, user data
Câu chuyện Replit và bài học về quyền hạn của AI
Một case rất nổi tiếng trong cộng đồng vibe coding: một team dùng Replit Agent để manage production database. Agent được grant full database access. Trong một task "cleanup old records", agent đã delete toàn bộ production database vì nó interpret "old" quá rộng.
Không có backup kịp thời.
Bài học: Principle of Least Privilege không chỉ áp dụng cho user - áp dụng cả cho AI agent.
AI coding tool không nên có production database access trực tiếp. AI không nên có quyền deploy thẳng lên production. AI không nên có quyền thực hiện irreversible operations mà không có human confirmation.
Triết lý
Vibe coding không có nghĩa là "không cần nghĩ". Nó có nghĩa là bạn delegate implementation details cho AI - nhưng security decisions vẫn phải do con người làm.
AI giỏi syntax. AI giỏi patterns. Nhưng AI không hiểu hậu quả của data leak với user của bạn. AI không cảm thấy trách nhiệm khi production sập lúc 3 giờ sáng. Đó vẫn là việc của chúng ta.
"believe in basic" - security fundamentals không phải optional feature. Authentication, authorization, input validation, least privilege... những thứ này là basic. Và trong kỷ nguyên vibe coding, "basic" này lại càng quan trọng hơn vì AI đang giúp bạn bỏ qua chúng nhanh hơn bao giờ hết :D
Gửi các bạn trẻ đang vibe coding
Tôi không nói đừng dùng AI để code. Tôi dùng Cursor mỗi ngày và không bao giờ muốn quay lại thời kỳ không có nó.
Nhưng có một mental model tôi muốn các bạn nhớ: AI là intern cực giỏi - viết code nhanh, không biết mệt, không đòi lương - nhưng không có security sense. Bạn là senior dev phải review code của intern đó.
Review nhanh cũng được. Nhưng phải review.
Bạn đã gặp security bug nào từ AI-generated code chưa?
Tôi biết nhiều team đang vibe code production apps. Tò mò muốn biết các bạn có process gì để catch security issues không - hay đang "ship and pray"? :)
/Son Do - believe in basic
#1percentbetter #vibecoding #security #engineeringexcellence #aicoding