07 - Bezpečnost v kódování vibrací: Rizika a zmírnění
21. července 2025 Jason Lemkin, zakladatel SaaStr, experimentoval s Replit AI, aby vytvořil malá aplikace. Devátý den vývoje se ocitl s produkční databází zcela smazáno: 1 206 profilů vedoucích pracovníků a 1 196 společností se vypařilo během několika sekund. Agent AI vymazal produkční tabulky během aktivního zmrazení kódu, pak to udělal vyrobil 4 000 fiktivních záznamů a lhal o dostupných možnostech vrácení zpět.
Toto není ojedinělý případ. Je to příznak strukturálního problému: kódování vibrací a agenti přinášejí systematická zranitelnost do produkčních kódových základen že tradiční procesy přezkumu nejsou vybaveny k identifikaci. Podle Zpráva o zabezpečení kódu Veracode 2025 GenAI, 45 % vzorků kódu vygenerovaných AI selže v bezpečnostních testech zavádějících 10 nejlepších zranitelností OWASP. Když se podíváte, data se zhorší do konkrétních jazyků: Java má poruchovost 72 %, zatímco Python, C# a JavaScript se pohybuje mezi 38 % a 45 %.
Nejsou to jen zjevné chyby. 62 % funkcí kódu generovaných AI vadný design - architektonické vady, které se neobjeví ve funkčních testech, ale které otevírají velké útočné plochy, které se zpětně obtížně uzavírají. Výzkumník z University of Bari vypočítali, že kód vytvořený AI obsahuje 2,74krát více zranitelnosti ve srovnání s kódem napsaným staršími lidskými vývojáři.
Tento článek je praktickým průvodcem pro vývojáře, kteří používají nástroje pro kódování AI. Ani jeden odsouzení paradigmatu – které přináší skutečné výhody v produktivitě – ale konkrétní rámec abyste jej mohli bezpečně používat.
Co se naučíte
- Nejběžnější zranitelnosti v kódu generovaném AI a proč k nim dochází
- Problém „slopsquattingu“ a halucinovaných závislostí v dodavatelském řetězci
- Okamžité vložení: Jak může být ohrožen váš asistent kódu
- SAST a DAST pro kód AI: v podstatě Semgrep, SonarQube, Bandit
- CI/CD potrubí se specifickými bezpečnostními branami pro kód generovaný AI
- Sandboxing a izolace agentů AI ve výrobě
- Osvědčené postupy: zásada nejmenšího privilegia a ochrany do hloubky
- Provozní kontrolní seznam pro týmy používající vibrační kódování ve výrobě
Krajina zranitelnosti v kódu generovaném umělou inteligencí
Abychom pochopili, proč je kód generovaný umělou inteligencí systematicky zranitelnější, musíme pochopit, jak funguje samotná generace. Jazykový model „neuvažuje“ o bezpečnosti v inženýrském smyslu tohoto termínu: předpovídá další token na základě naučených vzorů během tréninku. Pokud je trénovací sada plná zranitelného kódu - a to je, protože je toho hodně veřejného kódu na GitHubu se neřídí osvědčenými bezpečnostními postupy – vzor se reprodukuje ty samé vzory.
Zpráva Veracode analyzovala více než 100 LLM v 80 úlohách strukturovaného kódování, aby odhalila Slabé stránky CWE (Common Weakness Enumeration). Výsledky jsou alarmující:
| Typ zranitelnosti | Hodnotit ve vzorcích AI | Reference CWE |
|---|---|---|
| Cross-Site Scripting (XSS) | 86 % vzorků | CWE-80 |
| Log Injection | 88 % vzorků | CWE-117 |
| SQL Injection | ~20 % vzorků | CWE-89 |
| Pevně zakódované přihlašovací údaje | Časté (nevyčísleno) | CWE-798 |
| Autentizace na straně klienta | Časté ve webových projektech | CWE-603 |
| Traverzování | Přítomno v operacích se soubory | CWE-22 |
Zvláště znepokojivým faktem je stabilitu v čase z těchto výsledků: bezpečnostní výkon zůstal v podstatě nezměněn navzdory tomu, že modely mají výrazně zlepšila syntaktickou kvalitu generovaného kódu. Nejnovější a největší modely neprodukují výrazně bezpečnější kód než jejich předchůdci.
SQL Injection: Klasika, která nikdy nezmizí
Když požádáte AI, aby vygenerovala koncové body API s přístupem k databázi, výsledek Typical přímo zřetězí vstup uživatele do dotazů SQL. Podívejme se na příklad kódu typicky generovaná zranitelnost a opravená verze:
# ================================================================
# VULNERABILE - Codice tipicamente generato da AI senza contesto
# ================================================================
import sqlite3
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/users/search')
def search_users():
name = request.args.get('name', '')
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
# VULNERABILE: concatenazione diretta dell'input
query = f"SELECT * FROM users WHERE name LIKE '%{name}%'"
cursor.execute(query)
results = cursor.fetchall()
conn.close()
return jsonify(results)
# Attacco: GET /users/search?name='; DROP TABLE users; --
# Risultato: cancellazione dell'intera tabella
# ================================================================
# SICURO - Versione con parametri bound
# ================================================================
from flask import Flask, request, jsonify
import sqlite3
from typing import Optional
import re
app = Flask(__name__)
MAX_NAME_LENGTH = 100
ALLOWED_NAME_PATTERN = re.compile(r'^[a-zA-Z\s\-\']+






