Zabezpieczanie aplikacji za pomocą CodeMender

1. Zanim zaczniesz

⏱️ Czas trwania: 3:00

Witamy w praktycznym ćwiczeniu z programowania dotyczącym zabezpieczania aplikacji za pomocą CodeMender na platformie Gemini Enterprise Agent Platform w Google Cloud.

Podczas tych warsztatów wcielisz się w rolę inżyniera ds. zabezpieczeń w chmurze, którego zadaniem jest przeprowadzenie audytu i zabezpieczenie OWASP Juice Shop – standardowej, celowo podatnej na ataki aplikacji internetowej utworzonej przy użyciu Node.js, Express, TypeScript i Angular.

Tradycyjne narzędzia do skanowania zabezpieczeń (SAST/DAST) zalewają zespoły programistów tysiącami statycznych wyników dotyczących zabezpieczeń, wysokimi wskaźnikami wyników fałszywie dodatnich i zerową liczbą poprawek kodu, które można zastosować. Programiści spędzają godziny na analizowaniu logów, śledzeniu przepływów danych i ręcznym pisaniu poprawek, które często zakłócają działanie aplikacji.

CodeMender rewolucjonizuje bezpieczeństwo kodu, wykorzystując dostrojone środowisko agentowe oparte na dużych modelach językowych Gemini od Google. Dzięki promptom opracowanym przez Google DeepMind, specjalistycznym umiejętnościom w zakresie bezpieczeństwa i orkiestracji wielu agentów CodeMender działa jako autonomiczny współtwórca zabezpieczeń AI, który znajduje, weryfikuje i usuwa luki w zabezpieczeniach oprogramowania bezpośrednio w lokalnych repozytoriach źródłowych.

Wymagania wstępne

  • Podstawowa znajomość luk w zabezpieczeniach aplikacji internetowych (10 najważniejszych luk według OWASP, takich jak wstrzyknięcie kodu SQL i XSS)
  • Podstawowa znajomość języków JavaScript/TypeScript i aplikacji Node.js.
  • podstawowa znajomość narzędzi interfejsu wiersza poleceń (CLI);

Czego się nauczysz

  • jak skonfigurować, uwierzytelnić i zainicjować interfejs wiersza poleceń CodeMender (cm) w Google Cloud Shell;
  • Jak samodzielnie skanować repozytorium w celu wykrycia luk w zabezpieczeniach, które można wykorzystać (cm find).
  • Jak sprawdzać luki w zabezpieczeniach w odizolowanych piaskownicach i sprawdzać artefakty weryfikacji (cm verify).
  • jak samodzielnie syntetyzować, testować i stosować poprawki zabezpieczeń uwzględniające kontekst (cm fix);
  • jak przeprowadzać kontrolę danych telemetrycznych tokenów i eksportować raporty zgodności w wielu formatach (cm stats, cm report).

Wymagania

  • projekt Google Cloud z włączonymi rozliczeniami,
  • Google Cloud Shell z aktywnym połączeniem z projektem (obejmuje wstępnie zainstalowane narzędzia gcloud, git i Node.js 18 lub nowsze)
  • Repozytorium początkowe: repozytorium OWASP Juice Shop na GitHubie

2. Wprowadzenie do architektury CodeMender

⏱️ Czas trwania: 4:00

Zanim przejdziemy do skanowania i naprawiania kodu, dowiedzmy się, jak działa CodeMender w ramach platformy Gemini Enterprise Agent zgodnie z oficjalnymi standardami architektury Google Cloud.

Architektura systemu: agent i demon klienta

Przepływ pracy mechanizmu autonomicznej naprawy CodeMender

Z perspektywy użytkownika CodeMender składa się z 2 głównych komponentów architektonicznych:

Hostowana platforma z wieloma agentami: hostowany system wieloagentowy działający w Google Cloud, który wykonuje podstawową logikę biznesową dotyczącą bezpieczeństwa, inżynierię promptów LLM i rozumowanie dotyczące bezpieczeństwa.

Interfejs wiersza poleceń klienta lokalnego i demon piaskownicy (cm): klient działający w Google Cloud Shell, który działa zarówno jako interfejs wiersza poleceń (do wydawania poleceń takich jak cm find, cm verify, cm fix), jak i lokalny demon (do bezpiecznego wykonywania poleceń w imieniu agenta w odizolowanej piaskownicy na poziomie procesu).

3 podstawowe funkcje naprawcze

Przepływ autonomicznej naprawy CodeMender

CodeMender dba o bezpieczeństwo kodu na 3 zintegrowanych etapach:

Znajdowanie luk w zabezpieczeniach (cm find): skanuje bazy kodu za pomocą LLM kierowanego przez agenta, wykorzystując specjalistyczne narzędzia zabezpieczające i inżynierię promptów, aby skupić model na lukach w zabezpieczeniach. (Wyniki można też importować z zewnętrznych narzędzi do skanowania zabezpieczeń).

Verify Vulnerabilities (cm verify): kompiluje kod lokalnie i próbuje wykorzystać wykryte luki, aby sprawdzić, czy można je wykorzystać. Eliminuje to fałszywie pozytywne wyniki i generuje trwałe artefakty weryfikacji obszaru roboczego w .exploit/ (info.yaml, PLAN.md, LOG.md, exploit.sh, REPORT.md).

Naprawianie luk w zabezpieczeniach (cm fix): syntezuje poprawki źródłowe uwzględniające język i weryfikuje je, uruchamiając kompilację projektu i zestawy testów regresyjnych (npm test) w lokalnej piaskownicy.

3. Konfigurowanie środowiska OWASP Juice Shop

⏱️ Czas trwania: 5:00

W tym kroku otworzysz środowisko terminala Google Cloud i pobierzesz repozytorium aplikacji docelowej.

Krok 1. Otwórz Cloud Shell w konsoli Google Cloud

Otwórz konsolę Google Cloud w przeglądarce.

Na górnym pasku nawigacyjnym kliknij przycisk Aktywuj Cloud Shell (ikona >_).

Cloud Shell udostępnia terminal Linux w przeglądarce z fabrycznie zainstalowanymi i uwierzytelnionymi narzędziami gcloud, git i Node.js.

Krok 2. Sklonuj repozytorium OWASP Juice Shop

W Cloud Shell lub terminalu lokalnym sklonuj repozytorium OWASP Juice Shop:

git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop

Krok 3. Sprawdź kluczowe pliki aplikacji

OWASP Juice Shop używa Express.js w backendzie z modułami TypeScript. Spójrz na strukturę katalogu:

ls -la routes/ lib/

Zwróć uwagę na kluczowe pliki tras, które obsługują uwierzytelnianie, zapytania użytkowników i administrowanie koszykiem:

routes/login.ts: obsługuje uwierzytelnianie użytkowników i wykonywanie nieprzetworzonych zapytań SQL.

routes/search.ts: obsługuje wyszukiwanie produktów i renderowanie odpowiedzi.

routes/basket.ts: obsługuje pobieranie koszyka użytkownika.

routes/trackOrder.ts: obsługuje śledzenie zamówień za pomocą zapytań NoSQL.

lib/xml.ts: obsługuje analizowanie plików XML i przesyłanie plików.

lib/insecurity.ts: narzędzia pomocnicze do tokenów sesji i szyfrowania.

4. Zainstaluj interfejs wiersza poleceń CodeMender (cm) i uwierzytelnij dane logowania GCP

⏱️ Czas trwania: 8:00

W tym kroku włączysz wymagane interfejsy Google Cloud API, przyznasz uprawnienia uprawnień za pomocą gcloud, pobierzesz i zainstalujesz plik binarny interfejsu wiersza poleceń cm oraz skonfigurujesz domyślne uwierzytelnianie aplikacji (ADC).

Krok 1. Włącz wymagane interfejsy Google Cloud API za pomocą gcloud

CodeMender wymaga interfejsu Agent Platform API (aiplatform.googleapis.com) i interfejsu Cloud Resource Manager API (cloudresourcemanager.googleapis.com) na platformie Gemini Enterprise Agent Platform.

W Cloud Shell lub terminalu pobierz aktywny identyfikator projektu (lub sprawdź menu projektu u góry konsoli Google Cloud) i włącz wymagane interfejsy API usługi:

# Automatically retrieve and set your active Google Cloud project ID
export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project ${PROJECT_ID}

# Enable required Google Cloud APIs
gcloud services enable \
 aiplatform.googleapis.com \
 cloudresourcemanager.googleapis.com \
 serviceusage.googleapis.com \
 --project=${PROJECT_ID}

Sprawdź, czy interfejsy API są włączone:

gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"

Krok 2. Przyznaj uprawnienia za pomocą gcloud

Aby korzystać z silnika rozumowania CodeMender w chmurze, użytkownicy i konta usługi muszą mieć przypisaną rolę uprawnień roles/aiplatform.user (użytkownik usługi Agent Platform).

Przyznawanie roli uprawnień kontu użytkownika za pomocą interfejsu wiersza poleceń

# Get your active authenticated gcloud account email
USER_EMAIL=$(gcloud config get-value account)

# Add IAM policy binding for user account
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
 --member="user:${USER_EMAIL}" \
 --role="roles/aiplatform.user"

Krok 3. Pobierz i zainstaluj cm CLI w Cloud Shell

W Google Cloud Shell dane użytkownika są trwale przechowywane w katalogu $HOME. Uruchom te polecenia, aby zainstalować cm w ~/bin bez konieczności używania sudo. Nadal znajdujesz się w ~/juice-shop z poprzedniej sekcji, więc polecenia pobierają dane do katalogu tymczasowego, a następnie go czyszczą. Dzięki temu w repozytorium Juice Shop nie znajdą się żadne pliki instalatora:

# Download into a temporary directory so nothing lands in the Juice Shop repository
CM_TMP=$(mktemp -d)
curl -L -o "${CM_TMP}/cm-linux-amd64.zip" "https://artifactregistry.googleapis.com/download/v1/projects/cmoc-prod/locations/us/repositories/codemender-cli-production/files/cm:stable:cm-linux-amd64.zip:download?alt=media"
unzip -o "${CM_TMP}/cm-linux-amd64.zip" -d "${CM_TMP}"

# Install into your persistent ~/bin directory and clean up
mkdir -p ~/bin
install -m 0755 "${CM_TMP}/cm" ~/bin/cm
rm -rf "${CM_TMP}"

# Add ~/bin to PATH for this session and future Cloud Shell sessions
export PATH="$HOME/bin:$PATH"
grep -qxF 'export PATH="$HOME/bin:$PATH"' ~/.bashrc || echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc

Krok 4. Sprawdź instalację interfejsu wiersza poleceń cm.

Uruchom cm --version, aby sprawdzić, czy plik binarny interfejsu wiersza poleceń został prawidłowo zainstalowany:

cm --version

Oczekiwane dane wyjściowe:

cm version 0.17.0

Krok 5. Skonfiguruj domyślne uwierzytelnianie aplikacji (ADC) w Google Cloud

Skonfiguruj domyślne uwierzytelnianie aplikacji (ADC) w Google Cloud, aby usługa cm mogła uwierzytelniać żądania wysyłane do silnika rozumowania w chmurze:

gcloud auth application-default login

Pojawi się okno autoryzacji z etykietą Autoryzuj Cloud Shell. Kliknij Autoryzuj, aby przyznać dostęp.

5. Inicjowanie i weryfikowanie obszaru roboczego CodeMender

⏱️ Czas trwania: 3:00

Po zainstalowaniu i uwierzytelnieniu cm zainicjujesz obszar roboczy CodeMender w katalogu projektu docelowego i sprawdzisz konfigurację środowiska.

Krok 1. Zainicjuj obszar roboczy CodeMender (cm init)

Uruchom cm init z katalogu głównego projektu, aby zainicjować lokalne pliki śledzenia stanu i utworzyć konfiguracje bazowe:

cm init

Dane wyjściowe:

✅ Initialized CodeMender workspace at /home/user/.codemender

Krok 2. Przeprowadź kompleksową diagnostykę stanu (cm health)

Przed uruchomieniem sesji agenta uruchom cm health, aby sprawdzić dane logowania, konfigurację, osiągalność i autoryzację:

cm health

Dane wyjściowe:

CodeMender Health Check
───────────────────────
 Backend:   iapi
 Endpoint:  https://aiplatform.googleapis.com
 Location:  global
 Project:   my-gcp-project

 ✓ credentials     passed   (0ms)  Token acquired for project "my-gcp-project"
 ✓ config          passed   (0ms)  Configuration valid (backend "iapi")
 ✓ reachability    passed   (250ms)  Endpoint https://aiplatform.googleapis.com responded
 ✓ authorization   passed   (68ms)  Caller authorized for project "my-gcp-project"

Status: HEALTHY (exit code 0, 319ms)

Krok 3. Omówienie parametrów konfiguracji (config.yaml)

CodeMender tworzy plik konfiguracji obszaru roboczego w .codemender/config.yaml (lub ~/.codemender/config.yaml). Ten plik definiuje granice zasad, reguły uwzględniania plików i punkty zaczepienia weryfikacji testów:

# CodeMender CLI configuration.
# The server endpoint is baked in at build time (see build profiles).
# Override it here only if you need a different endpoint.

server: {}
location: "global"         # Service location: "global" (default), "us", "eu", or "us-central1" (overridden by $CM_LOCATION)

# Customer-supplied team identifier sent as the X-CodeMender-Team-Id
# telemetry header. Overridden by --team-id flag or $CM_TEAM_ID env var.
# Max 63 chars, must match [A-Za-z0-9._-]. Omit to skip the header.
# team_id: "acme-security"

scan:
 extensions:
   include: [".py", ".java", ".go", ".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".c", ".cc", ".cpp", ".cxx", ".h", ".hh", ".hpp", ".hxx", ".inl", ".ipp", ".cs", ".rs", ".kt", ".kts", ".rb", ".php", ".sol", ".tf", ".hcl"]
   exclude: [".min.js", ".generated.go", ".pb.go"]
 # A leading "/" matches only that directory at the scan root.
 exclude_dirs: ["node_modules", "vendor", "dist", "/target", "/obj", "/build", ".gradle"]
 max_file_size_kb: 2048   # Maximum file size for discovery (2048 KB / 2 MiB)
 incremental: true

# Restrict agent file access to these directories (all commands).
# When empty, the scan target directory is used as the boundary.
# project_paths: []

output:
 format: table   # "table", "json", "sarif"

tools:
 confirm_commands: true   # Prompt Y/N before running shell commands (default: true)
 confirm_writes: true     # Prompt Y/N before writing/modifying files (default: true)
 # cleanup_candidate_branches: true # Auto-delete temporary candidate branches on completion (default: true)
 # Use --yes flag on find/fix/session resume to skip all confirmations

# Version Control and Automated Testing Guardrails
vcs:
 type: ""               # VCS type: "git", "mercurial", "custom", or "" (auto-detect)
 commands:
   reset: ""            # Shell command to reset codebase (auto-populated for known VCS)
   diff: ""             # Shell command to show changes (auto-populated for known VCS)
   status: ""           # Shell command to list modified files (auto-populated for known VCS)
   stage: ""            # Shell command to stage changes (auto-populated for known VCS)

build:
 command: "npm test"    # Shell command to build/verify changes from the agent

sandbox:
 enabled: true          # Process-level OS sandbox (default: true)
 mounts:
   target_dir: "."
 network:
   profile: "permissive-closed" # Complete network isolation; set to "permissive-open" if build requires internet
security:
 protected_files: []    # Files mounted read-only inside sandbox (e.g. ["~/.ssh/*"])

6. Wykrywanie luk w zabezpieczeniach za pomocą polecenia cm find .

⏱️ Czas trwania: 7:00

W tym kroku uruchomisz cm find . --quick, aby przeprowadzić skanowanie zabezpieczeń bazy kodu Juice Shop za pomocą agenta.

Krok 1. Wykonaj cm find . --quick

Począwszy od CodeMender w wersji 0.16.0, cm find <path> domyślnie używa głębokiego skanowania (

--deep

), aby przeprowadzić szczegółową analizę plik po pliku, lub Szybkie skanowanie (

--quick

) zapewnia szybką klasyfikację repozytoriów. Uruchom cm find . --quick, aby przeprowadzić szybkie skanowanie repozytorium OWASP Juice Shop (szacowany czas wykonania: ok. 8 minut w przypadku pełnej analizy bazy kodu składającej się z 684 plików):

cm find . --quick -y --sandbox=false --bypass-warning --model gemini-3.8-flash

cm uruchamia sesję skanowania na platformie Gemini Enterprise Agent Platform, analizując pliki kodu źródłowego we wszystkich modułach repozytorium:

⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository.
🔍 Discovering files in /home/user/juice-shop...
  Found 684 source files
🚀 Starting FIND session (mode: QUICK)...
  Server: https://aiplatform.googleapis.com
  Session: ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu
  Operation: ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu
📂 Scan target: /home/user/juice-shop
🔒 Sandbox roots (agent can only access these directories):
  • /home/user/juice-shop

📡 Waiting for server (https://aiplatform.googleapis.com)...
────────────────────────────────────────────────────────────
2026-10-29T03:01:47Z [INFO]  🔧 [Step 1] list_dir → /home/user/juice-shop
2026-10-29T03:01:56Z [INFO]  🔧 [Step 2] list_dir → .../juice-shop/routes
2026-10-29T03:02:08Z [INFO]  🔧 [Step 3] read_file → .../juice-shop/server.ts
2026-10-29T03:02:47Z [INFO]  🔧 [Step 7] read_file → .../juice-shop/routes/login.ts
2026-10-29T03:02:56Z [INFO]  🔧 [Step 8] read_file → .../juice-shop/routes/search.ts
2026-10-29T03:03:48Z [INFO]  🔧 [Step 13] read_file → .../juice-shop/routes/fileUpload.ts
2026-10-29T03:04:30Z [INFO]  🔧 [Step 16] read_file → .../juice-shop/routes/userProfile.ts
2026-10-29T03:06:11Z [INFO]  🔧 [Step 25] read_file → .../juice-shop/routes/trackOrder.ts
2026-10-29T03:07:57Z [INFO]  🔧 [Step 33] read_file → .../juice-shop/routes/order.ts
2026-10-29T03:09:30Z [INFO]  ✅ Completed 33 tool steps in 7m48s | Tokens: 2.6M in / 8k out / 2.7M total
────────────────────────────────────────────────────────────

🔒 Found 12 vulnerabilities:

ID        SEVERITY    TYPE                                     FILE                             TITLE                                                                                   CONFIDENCE
────────  ────────    ────                                     ────                             ─────                                                                                   ──────────
43aa7446  🔴 CRITICAL  SQL INJECTION                            routes/login.ts                  SQL Injection in User Login Handler Allows Authentication Bypass                        100%
dd83d0a4  🟠 HIGH      SQL INJECTION                            routes/search.ts                 UNION-Based SQL Injection in Product Search Allows Database Exfiltration                100%
4dfe2409  🟠 HIGH      CODE INJECTION                           routes/userProfile.ts            Remote Code Execution via Eval in User Profile Template Handler                         100%
79d490b0  🟠 HIGH      PATH TRAVERSAL                           routes/fileUpload.ts             Path Traversal (Zip Slip) in Zip File Upload Allows Arbitrary File Overwrite            100%
4f2b050c  🟠 HIGH      XML EXTERNAL ENTITY (XXE)                routes/fileUpload.ts             XML External Entity (XXE) Injection in File Upload Route Leaks System Files             100%
1ece0e25  🟠 HIGH      IMPROPER ACCESS CONTROL                  server.ts                        Missing Authorization on Product Update Endpoint Allows Unauthorized Product Tampering  100%
757fd438  🟠 HIGH      CWE-943                                  routes/trackOrder.ts             NoSQL / JavaScript Injection in Order Tracking Allows Database Record Exfiltration      100%
349bac9f  🟡 MEDIUM    SERVER-SIDE REQUEST FORGERY (SSRF)       routes/profileImageUrlUpload.ts  Server-Side Request Forgery (SSRF) in Profile Image URL Upload Route                    100%
be5e1459  🟡 MEDIUM    OPEN REDIRECT                            routes/redirect.ts               Open Redirect via Inadequate Allowlist Substring Match                                  100%
06ecf8a5  🟡 MEDIUM    INSECURE DIRECT OBJECT REFERENCE (IDOR)  routes/basket.ts                 Insecure Direct Object Reference (IDOR) Allows Access to Arbitrary User Baskets         100%
02f6a293  🟡 MEDIUM    PATH TRAVERSAL                           routes/dataErasure.ts            Local File Read via Insecure Template Layout Parameter in Data Erasure Route            100%
95ee59a3  🟡 MEDIUM    CWE-943                                  routes/updateProductReviews.ts   NoSQL Injection in Product Review Update Endpoint Allows Mass Modification              100%

Summary: 1 CRITICAL, 6 HIGH, 5 MEDIUM

Run 'cm report' for detailed analysis, 'cm verify <finding-id>' to validate, or 'cm fix <finding-id>' to generate a patch.
2026-10-29T03:09:30Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T030140Z_ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu.log

Krok 2. Przejrzyj wyniki skanowania w cm report

Uruchom cm report -f table, aby wyświetlić wszystkie wykryte wyniki dotyczące bezpieczeństwa z lokalnej bazy danych stanu SQLite:

cm report -f table

Dane wyjściowe:

┌──────────┬───────────┬──────┬───┬──────────────────────────────┬────────────────────────────────────────┐
│ID        │Severity   │Status│Fix│File                          │Title                                   │
├──────────┼───────────┼──────┼───┼──────────────────────────────┼────────────────────────────────────────┤
│ 43aa7446 │🔴 CRITICAL│OPEN  │—  │routes/login.ts               │SQL Injection in User Login Handler A...│
│ dd83d0a4 │🟠 HIGH    │OPEN  │—  │routes/search.ts              │UNION-Based SQL Injection in Product ...│
│ 4dfe2409 │🟠 HIGH    │OPEN  │—  │routes/userProfile.ts         │Remote Code Execution via Eval in Use...│
│ 79d490b0 │🟠 HIGH    │OPEN  │—  │routes/fileUpload.ts          │Path Traversal (Zip Slip) in Zip File...│
│ 4f2b050c │🟠 HIGH    │OPEN  │—  │routes/fileUpload.ts          │XML External Entity (XXE) Injection i...│
│ 1ece0e25 │🟠 HIGH    │OPEN  │—  │server.ts                     │Missing Authorization on Product Upda...│
│ 757fd438 │🟠 HIGH    │OPEN  │—  │routes/trackOrder.ts          │NoSQL / JavaScript Injection in Order...│
│ 349bac9f │🟡 MEDIUM  │OPEN  │—  │routes/profileImageUrlUploa...│Server-Side Request Forgery (SSRF) in...│
│ be5e1459 │🟡 MEDIUM  │OPEN  │—  │routes/redirect.ts            │Open Redirect via Inadequate Allowlis...│
│ 06ecf8a5 │🟡 MEDIUM  │OPEN  │—  │routes/basket.ts              │Insecure Direct Object Reference (IDO...│
│ 02f6a293 │🟡 MEDIUM  │OPEN  │—  │routes/dataErasure.ts         │Local File Read via Insecure Template...│
│ 95ee59a3 │🟡 MEDIUM  │OPEN  │—  │routes/updateProductReviews.ts│NoSQL Injection in Product Review Upd...│
└──────────┴───────────┴──────┴───┴──────────────────────────────┴────────────────────────────────────────┘

12 finding(s): 1 CRITICAL, 6 HIGH, 5 MEDIUM · ✅ 0 fixed, 🔴 12 open
📋 Report generated at 2026-10-29 03:10:05 UTC
2026-10-29T03:10:05Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T031005Z_pending.log

Krok 3. Zapoznaj się ze stanami cyklu życia i poziomami ważności wyników

CodeMender śledzi luki w zabezpieczeniach w ramach formalnego cyklu życia obejmującego 4 stany:

Stan wykrycia

Znaczenie i obsługa przejść

OPEN

Luka w zabezpieczeniach została wykryta (lub zaimportowana), ale nie została jeszcze zweryfikowana, załatana ani odrzucona.

FIXED

CodeMender wygenerował poprawkę, zastosował różnice i sprawdził, czy pakiety kompilacji/zestawów testów działają, a exploity nie.

DISMISSED

Oznaczono jako nieaktywne z powodu niskiego poziomu ufności, braku modelu zagrożeń lub zweryfikowania jako wynik fałszywie pozytywny. Wycisza przyszłe alerty.

REOPENED

Wykryto ponownie błąd FIXED lub DISMISSED w późniejszym skanowaniu (co wskazuje na regresję kodu).

Klasyfikacja poziomu ważności

🔴 CRITICAL: natychmiastowe, poważne ryzyko (np. zdalne wykonanie kodu, nieuwierzytelnione wstrzyknięcie kodu SQL) bezpośrednio dostępne z niezaufanych granic.

 HIGH: poważna luka (np. dowolny odczyt bazy danych, eskalacja uprawnień) wymagająca określonego kontekstu użytkownika lub powiązanych warunków.

🟡 MEDIUM: umiarkowane ryzyko o ograniczonym zakresie lub wymagające interakcji użytkownika (np. otwarte przekierowanie, CSRF).

LOW: błędy związane z higieną obrony w głąb lub wektory rozpoznawcze o minimalnym bezpośrednim wpływie.

7. Weryfikowanie luk w zabezpieczeniach i przeglądanie przechwyconych artefaktów weryfikacji

⏱️ Czas trwania: 10:00

Jedną z najważniejszych funkcji CodeMender jest automatyczne generowanie trwałych artefaktów weryfikacji przy każdym uruchomieniu cm verify. Zweryfikujmy wynik Krytyczne wstrzyknięcie kodu SQL w routes/login.ts (w tym samouczku oznaczony jako 43aa7446) i przeanalizujmy artefakty utworzone przez agenta.

Krok 1. Wykonaj cm verify <login-finding-id>

Znajdź identyfikator wyniku dla routes/login.ts w tabeli cm report (na przykład 43aa7446) i uruchom cm verify <finding-id> --sandbox=false --bypass-warning -y (szacowany czas wykonania: około 20 minut na wykonanie kroków autonomicznego narzędzia, uruchomienie usług w tle i wykonanie skryptów exploitów PoC na żywo):

# Replace 43aa7446 with your actual login.ts finding ID
# --sandbox=false turns off only the OS-level sandbox; the path boundary and command policy stay enforced
cm verify 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash

Dane wyjściowe:

⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository.
🔬 Verifying finding: SQL Injection in User Login Handler Allows Authentication Bypass
  ID: 43aa7446-40de-467d-8ca4-8571dca16036
  File: /home/user/juice-shop/routes/login.ts
  Severity: 🔴 CRITICAL
  Type: SQL INJECTION
Resetting workspace at /home/user/juice-shop

🔧 Running: git checkout HEAD -- . && git clean -fd
Removing .cm_project

✅ Reset complete. Ready for vulnerability research.
🚀 Starting VERIFY session...
  Server: https://aiplatform.googleapis.com
  Session: ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
  Operation: ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
📂 Scan target: /home/user/juice-shop/routes
🔒 Sandbox boundary (agent can explore within):
  • /home/user/juice-shop

📡 Waiting for verification agent (https://aiplatform.googleapis.com)...
────────────────────────────────────────────────────────────
2026-10-29T03:11:31Z [INFO]  🔧 [Step 1] run_command → mkdir -p /home/user/juice-shop/.exploit
2026-10-29T03:11:42Z [INFO]  🔧 [Step 2] read_file → .../juice-shop/routes/login.ts
2026-10-29T03:12:03Z [INFO]  🔧 [Step 4] read_file → .../juice-shop/package.json
2026-10-29T03:12:14Z [INFO]  🔧 [Step 5] write_to_file → .../juice-shop/.exploit/PLAN.md
2026-10-29T03:19:00Z [INFO]  🔧 [Step 25] run_command → npm run build:server
2026-10-29T03:29:20Z [INFO]  🔧 [Step 61] write_to_file → .../juice-shop/.exploit/info.yaml
2026-10-29T03:29:53Z [INFO]  🔧 [Step 63] write_to_file → .../juice-shop/.exploit/LOG.md
2026-10-29T03:30:17Z [INFO]  🔧 [Step 64] write_to_file → .../juice-shop/.exploit/REPORT.md
2026-10-29T03:30:55Z [INFO]  🔧 [Step 66] run_command → git status --short
2026-10-29T03:31:46Z [INFO]  ✅ Completed 66 tool steps in 20m23s | Tokens: 2.8M in / 7k out / 2.8M total
────────────────────────────────────────────────────────────
2026-10-29T03:31:46Z [INFO]  Artifacts manifest written: /home/user/.codemender/artifacts/ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu/manifest.json (7 artifacts)
📦 Captured 7 agent artifacts in /home/user/.codemender/artifacts/ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
Pulling artifacts for session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
Resetting workspace at /home/user/juice-shop

🔧 Running: git checkout HEAD -- . && git clean -fd
Removing .cm_project
Removing .exploit/LOG.md
Removing .exploit/PLAN.md
Removing .exploit/REPORT.md
Removing .exploit/exploit.sh
Removing .exploit/info.yaml
Removing .exploit/server_runner.js

✅ Reset complete. Ready for vulnerability research.
📥 Copying 7 finding artifact(s) to workspace...
  • /home/user/juice-shop/.exploit/LOG.md
  • /home/user/juice-shop/.exploit/PLAN.md
  • /home/user/juice-shop/.exploit/REPORT.md
  • /home/user/juice-shop/.exploit/exploit.sh
  • /home/user/juice-shop/.exploit/info.yaml
  • /home/user/juice-shop/.exploit/server.log
  • /home/user/juice-shop/.exploit/server_runner.js

🚀 Programmatically running exploit script to confirm: /home/user/juice-shop/.exploit/exploit.sh
EXPLOIT SUCCESSFUL

✅ Exploit execution succeeded. Finding VERIFIED (confidence: 100%)

Run 'cm report' to see updated findings.
2026-10-29T03:31:52Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T031121Z_ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu.log

Krok 2. Przegląd zarejestrowanych artefaktów weryfikacji

Począwszy od wersji 0.16.0 CodeMender, artefakty weryfikacji są standaryzowane w katalogu głównym repozytorium w .exploit/, a ich stała kopia jest przechowywana w ~/.codemender/artifacts/<session-id>/. Są to lokalne pliki robocze, a nie część poprawki, więc wykluczysz je z Git, zanim w następnej sekcji przygotujesz poprawkę. Uruchom ls -la .exploit/, aby wyświetlić ich listę:

ls -la .exploit/

Dane wyjściowe:

total 40
drwxrwxr-x  2 user user 4096 Oct 29 03:31 .
drwxrwxr-x 35 user user 4096 Oct 29 03:31 ..
-rwxr-xr-x  1 user user 3272 Oct 29 03:31 exploit.sh
-rw-r--r--  1 user user  313 Oct 29 03:31 info.yaml
-rw-r--r--  1 user user 2196 Oct 29 03:31 LOG.md
-rw-r--r--  1 user user  771 Oct 29 03:31 PLAN.md
-rw-r--r--  1 user user 6387 Oct 29 03:31 REPORT.md
-rw-rw-r--  1 user user 2438 Oct 29 03:31 server.log
-rw-rw-r--  1 user user  462 Oct 29 03:31 server_runner.js

Plik artefaktu

Kategoria

Purpose

info.yaml

Plik manifestu metadanych

Strukturalny plik YAML definiujący UUID, tytuł, wagę (CRITICAL), poziom ufności (certain) i tagi CWE (cwe-89) wykrycia.

PLAN.md

Strategia dotycząca agentów

Szczegółowy plan weryfikacji i lista kontrolna wykonywane autonomicznie przez silnik rozumowania CodeMender.

LOG.md

Log śledzenia wykonania

Rejestr kontrolny ze znacznikami czasu, który rejestruje każde wywołanie narzędzia, punkt końcowy żądania HTTP i wynik testu.

server_runner.js/server.log

Logi pomocniczego modułu uruchamiającego / serwera

Skrypt pomocniczy utworzony przez agenta w celu uruchomienia Juice Shop na potrzeby testów oraz przechwycone dane wyjściowe serwera.

exploit.sh

Opakowanie wykonania / samodzielny model koncepcyjny

Skrypt powłoki uruchamiający usługę docelową i wywołujący klienta PoC, który sprawdza odpowiedzi HTTP 200.

REPORT.md

Analiza głównej przyczyny

Streszczenie, szczegółowa analiza luk w zabezpieczeniach, zestawienie nieprzetworzonych danych SQL i zalecenia dotyczące parametryzacji Sequelize.

Krok 3. Szczegółowe omówienie najważniejszych elementów artefaktów weryfikacji

Agent zapisuje te artefakty przy każdym uruchomieniu, więc ich dokładna zawartość za każdym razem się różni. Otwórz je w edytorze Cloud Shell (lub za pomocą cat) i poszukaj tych elementów:

Artefakt

Na co zwrócić uwagę

info.yaml

Pełny identyfikator, tytuł, poziom ważności, poziom ufności i tagi, takie jak cwe-89.

PLAN.md

lista kontrolna, którą kierował się agent, od przeczytania zgłoszonego pliku po napisanie skryptu reprodukcji;

LOG.md

Działania i wyniki ze znacznikami czasu, w tym wynik każdego uruchomienia skryptu odtwarzającego.

exploit.sh

samodzielny skrypt odtwarzający: jak uruchamia aplikację, do którego punktu końcowego się odwołuje i jak określa sukces (wyświetla EXPLOIT SUCCESSFUL);

server_runner.js/server.log

Pliki pomocnicze utworzone przez agenta w celu uruchomienia Juice Shop do testów oraz dane wyjściowe tego serwera.

REPORT.md

analizę głównej przyczyny: podatny na ataki wiersz w pliku routes/login.ts, dlaczego można go wykorzystać i zalecane rozwiązanie (zapytania parametryczne);

8. Naprawianie wstrzyknięcia kodu SQL za pomocą poprawki cm

⏱️ Czas trwania: 10:00

Po zweryfikowaniu wyniku wstrzyknięcia kodu SQL w routes/login.ts (przykładowy identyfikator: 43aa7446) i przeanalizowaniu jego artefaktów wykonajmy cm fix, aby zastosować automatyczną poprawkę zapytania z parametrami.

Krok 1. Wykonaj cm fix <login-finding-id> -y

Uruchom cm fix <finding-id> --sandbox=false --bypass-warning -y (zastąp 43aa7446 rzeczywistym identyfikatorem wyniku logowania z cm report), aby wygenerować i zastosować poprawkę:

# Replace 43aa7446 with your actual login.ts finding ID
cm fix 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash

Dane wyjściowe:

⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository.
🩹 Fixing finding: SQL Injection in User Login Handler Allows Authentication Bypass
  File: /home/user/juice-shop/routes/login.ts
  Severity: CRITICAL
🔒 Sandbox roots (agent can only access these directories):
  • /home/user/juice-shop
Found latest VERIFY session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu for finding 43aa7446-40de-467d-8ca4-8571dca16036
Pulling artifacts for session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
Resetting workspace at /home/user/juice-shop

🔧 Running: git checkout HEAD -- . && git clean -fd
Removing .cm_project
Removing .exploit/LOG.md
Removing .exploit/PLAN.md
Removing .exploit/REPORT.md
Removing .exploit/exploit.sh
Removing .exploit/info.yaml
Removing .exploit/server_runner.js

✅ Reset complete. Ready for vulnerability research.
📥 Copying 7 finding artifact(s) to workspace...
  • /home/user/juice-shop/.exploit/LOG.md
  • /home/user/juice-shop/.exploit/PLAN.md
  • /home/user/juice-shop/.exploit/REPORT.md
  • /home/user/juice-shop/.exploit/exploit.sh
  • /home/user/juice-shop/.exploit/info.yaml
  • /home/user/juice-shop/.exploit/server.log
  • /home/user/juice-shop/.exploit/server_runner.js
  Session: ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu
  Operation: ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu

📡 Waiting for fix agent (https://aiplatform.googleapis.com)...
────────────────────────────────────────────────────────────
2026-10-29T03:41:30Z [INFO]  🔧 [Step 4] read_file → .../juice-shop/routes/login.ts
2026-10-29T03:41:58Z [INFO]  🔧 [Step 6] run_command → npm run test:server
2026-10-29T03:43:11Z [INFO]  🔧 [Step 9] grep_search → pattern="sequelize\\.query" path=.../juice-shop/routes
2026-10-29T03:43:54Z [INFO]  🔧 [Step 12] read_file → .../juice-shop/routes/vulnCodeSnippet.ts
2026-10-29T03:44:41Z [INFO]  🔧 [Step 13] read_file → .../juice-shop/routes/vulnCodeFixes.ts
2026-10-29T03:53:14Z [INFO]  🔧 [Step 31] search_and_replace → .../juice-shop/routes/login.ts
2026-10-29T03:53:52Z [INFO]  🔧 [Step 33] run_command → npm run build:server
2026-10-29T03:55:23Z [INFO]  🔧 [Step 37] run_command → npm run test:server
2026-10-29T03:55:49Z [INFO]  🔧 [Step 38] run_command → git diff
2026-10-29T03:57:18Z [INFO]  ✅ Completed 43 tool steps in 16m54s | Tokens: 1.6M in / 4k out / 1.6M total
────────────────────────────────────────────────────────────

✨ Patch generated successfully!

diff --git a/routes/login.ts b/routes/login.ts
index fb9fce3..57f3afe 100644
--- a/routes/login.ts
+++ b/routes/login.ts
@@ -31,7 +31,14 @@ export function login () {

  return (req: Request, res: Response, next: NextFunction) => {
    verifyPreLoginChallenges(req) // vuln-code-snippet hide-line
-    models.sequelize.query(`SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL`, { model: UserModel, plain: true }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
+    models.sequelize.query('SELECT * FROM Users WHERE email = :email AND password = :password AND deletedAt IS NULL', {
+      replacements: {
+        email: typeof req.body?.email === 'string' ? req.body.email : '',
+        password: security.hash(typeof req.body?.password === 'string' ? req.body.password : '')
+      },
+      model: UserModel,
+      plain: true
+    }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
      .then((authenticatedUser) => { // vuln-code-snippet neutral-line loginAdminChallenge loginBenderChallenge loginJimChallenge
        const user = utils.queryResultToJson(authenticatedUser)
        if (user.data?.id && user.data.totpSecret !== '') {

────────────────────────────────────────────────────────────
2026-10-29T03:57:18Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T034021Z_ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu.log

Krok 2. Sprawdź stan VCS i różnice za pomocą cm vcs

Uruchom cm vcs status i cm vcs diff, aby wyświetlić zmodyfikowane pliki obszaru roboczego:

cm vcs status
cm vcs diff

Dane wyjściowe:

📂 CodeMender VCS Status
──────────────────────────────────────────────────
  Directory: /home/user/juice-shop
  Command:   git status --short
──────────────────────────────────────────────────

M routes/login.ts
?? .cm_project
?? .exploit/
2026-10-29T03:59:47Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T035947Z_pending.log

Dwa nieśledzone wpisy to pliki lokalne CodeMender, które nie są częścią poprawki: .exploit/ zawiera artefakty weryfikacji z cm verify, a .cm_project oznacza katalog główny projektu dla CodeMender. W następnym kroku wykluczysz je z zatwierdzenia.

oraz cm vcs diff:

🔍 Running diff in /home/user/juice-shop: git diff
diff --git a/routes/login.ts b/routes/login.ts
index fb9fce3..57f3afe 100644
--- a/routes/login.ts
+++ b/routes/login.ts
@@ -31,7 +31,14 @@ export function login () {

  return (req: Request, res: Response, next: NextFunction) => {
    verifyPreLoginChallenges(req) // vuln-code-snippet hide-line
-    models.sequelize.query(`SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL`, { model: UserModel, plain: true }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
+    models.sequelize.query('SELECT * FROM Users WHERE email = :email AND password = :password AND deletedAt IS NULL', {
+      replacements: {
+        email: typeof req.body?.email === 'string' ? req.body.email : '',
+        password: security.hash(typeof req.body?.password === 'string' ? req.body.password : '')
+      },
+      model: UserModel,
+      plain: true
+    }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
      .then((authenticatedUser) => { // vuln-code-snippet neutral-line loginAdminChallenge loginBenderChallenge loginJimChallenge
        const user = utils.queryResultToJson(authenticatedUser)
        if (user.data?.id && user.data.totpSecret !== '') {

Krok 3. Przygotuj zweryfikowaną poprawkę za pomocą cm vcs stage

Po sprawdzeniu ujednoliconego pliku diff i potwierdzeniu, że rozwiązanie spełnia Twoje standardy jakości i bezpieczeństwa, przygotuj poprawkę do zatwierdzenia. Polecenie cm vcs stage uruchamia git add -A, więc przygotowuje każdą zmianę w drzewie roboczym, w tym nieśledzone wpisy .exploit/ i .cm_project z kroku 2. Najpierw dodaj je do pliku .git/info/exclude, czyli pliku ignorowania dostępnego tylko lokalnie, którego Git nigdy nie zatwierdza, aby tylko poprawka została umieszczona w przechowalni:

# Keep CodeMender's local files out of Git (local-only; not committed)
printf '.exploit/\n.cm_project\n' >> .git/info/exclude

Następnie przygotuj zmiany za pomocą polecenia cm vcs stage:

cm vcs stage

Dane wyjściowe:

📦 CodeMender VCS Stage
──────────────────────────────────────────────────
  Directory: /home/user/juice-shop
  Command:   git add -A
──────────────────────────────────────────────────

2026-10-29T04:00:06Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T040006Z_pending.log
✅ Changes staged successfully.

Sprawdź, czy w Git jest przygotowana tylko poprawka:

cm vcs status

Dane wyjściowe:

📂 CodeMender VCS Status
──────────────────────────────────────────────────
  Directory: /home/user/juice-shop
  Command:   git status --short
──────────────────────────────────────────────────

M  routes/login.ts

Jeśli przed zaktualizowaniem .git/info/exclude uruchomiono cm vcs stage, usuń pliki CodeMender z przechowalni za pomocą git restore --staged .exploit .cm_project. Pliki pozostają na dysku, są tylko usuwane z obszaru przejściowego.

Krok 4. Zatwierdź poprawkę i usuń artefakty weryfikacji

Zatwierdź przygotowaną poprawkę, zanim naprawisz kolejny błąd: każde uruchomienie cm fix i cm verify rozpoczyna się od zresetowania obszaru roboczego (git checkout HEAD -- . && git clean -fd), co powoduje odrzucenie niezatwierdzonych zmian. Następnie usuń lokalny folder .exploit/, aby następna poprawka zaczęła się od czystego obszaru roboczego. Ponieważ zasada .exploit/ jest teraz ignorowana, git clean -fd nie usuwa jej już za Ciebie. Trwała kopia artefaktów pozostaje w ~/.codemender/artifacts/<session-id>/.

git commit -m "fix: use parameterized query in login route"
rm -rf .exploit/

Jeśli Git poprosi o potwierdzenie tożsamości, uruchom w repozytorium polecenia git config user.name "Your Name" i git config user.email "you@example.com", a następnie ponownie zatwierdź zmiany.

9. Sprawdzanie poprawności poprawek, zarządzanie sesjami i eksportowanie raportów (cm report)

⏱️ Czas trwania: 8:00

Po zastosowaniu poprawki zabezpieczeń wygenerowanej przez AI należy zarządzać aktywnymi sesjami, sprawdzać statystyki wykorzystania tokenów i generować raporty zgodności z zasadami bezpieczeństwa przedsiębiorstwa za pomocą cm report.

Krok 1. Zarządzanie sesjami stanowymi (cm session list / resume / cancel)

CodeMender śledzi każde zadanie skanowania, weryfikacji i naprawy jako sesję stanową w lokalnej bazie danych SQLite (~/.codemender/state.db). Aby sprawdzić sesje, uruchom cm session list:

cm session list

Dane wyjściowe:

SESSION_ID  TYPE    STATUS       TARGET                          CREATED              RESUMABLE
──────────  ────    ──────       ──────                          ───────              ─────────
ChA0Yjll    FIX     ✅ COMPLETED  ...40de-467d-8ca4-8571dca16036  2026-10-29T03:40:21  —
ChBkZTRh    VERIFY  ✅ COMPLETED  ...40de-467d-8ca4-8571dca16036  2026-10-29T03:11:21  —
ChBjMjI4    FIND    ✅ COMPLETED  /home/user/juice-shop           2026-10-29T03:01:40  —

3 session(s) total
2026-10-22T02:24:43Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261022T022443Z_pending.log

Krok 2. Uruchom cm report, aby zweryfikować naprawione wyniki

Uruchom cm report -f table, aby wyświetlić zaktualizowane stany wyników (zauważ, że naprawione wyniki wyświetlają teraz FIXED z ✅ applied w kolumnie Fix):

cm report -f table

Dane wyjściowe:

┌──────────┬───────────┬──────┬──────────┬──────────────────────────────┬────────────────────────────────────────┐
│ID        │Severity   │Status│Fix       │File                          │Title                                   │
├──────────┼───────────┼──────┼──────────┼──────────────────────────────┼────────────────────────────────────────┤
│ 43aa7446 │🔴 CRITICAL│FIXED │✅ applied│routes/login.ts               │SQL Injection in User Login Handler A...│
│ dd83d0a4 │🟠 HIGH    │OPEN  │—         │routes/search.ts              │UNION-Based SQL Injection in Product ...│
│ 4dfe2409 │🟠 HIGH    │OPEN  │—         │routes/userProfile.ts         │Remote Code Execution via Eval in Use...│
│ 79d490b0 │🟠 HIGH    │OPEN  │—         │routes/fileUpload.ts          │Path Traversal (Zip Slip) in Zip File...│
│ 4f2b050c │🟠 HIGH    │OPEN  │—         │routes/fileUpload.ts          │XML External Entity (XXE) Injection i...│
│ 1ece0e25 │🟠 HIGH    │OPEN  │—         │server.ts                     │Missing Authorization on Product Upda...│
│ 757fd438 │🟠 HIGH    │OPEN  │—         │routes/trackOrder.ts          │NoSQL / JavaScript Injection in Order...│
│ 349bac9f │🟡 MEDIUM  │OPEN  │—         │routes/profileImageUrlUploa...│Server-Side Request Forgery (SSRF) in...│
│ be5e1459 │🟡 MEDIUM  │OPEN  │—         │routes/redirect.ts            │Open Redirect via Inadequate Allowlis...│
│ 06ecf8a5 │🟡 MEDIUM  │OPEN  │—         │routes/basket.ts              │Insecure Direct Object Reference (IDO...│
│ 02f6a293 │🟡 MEDIUM  │OPEN  │—         │routes/dataErasure.ts         │Local File Read via Insecure Template...│
│ 95ee59a3 │🟡 MEDIUM  │OPEN  │—         │routes/updateProductReviews.ts│NoSQL Injection in Product Review Upd...│
└──────────┴───────────┴──────┴──────────┴──────────────────────────────┴────────────────────────────────────────┘

12 finding(s): 1 CRITICAL, 6 HIGH, 5 MEDIUM · ✅ 1 fixed, 🔴 11 open
📋 Report generated at 2026-10-29 04:01:10 UTC
2026-10-29T04:01:10Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T040110Z_pending.log

Krok 3. Sprawdź wykorzystanie tokenów za pomocą cm stats

Uruchom cm stats, aby sprawdzić wykorzystanie lokalnych tokenów w różnych trybach skanowania (cm find --quick, cm verify i cm fix):

cm stats

Dane wyjściowe:

COMMAND          REQUESTS  POLLS  INPUT   OUTPUT  CACHED  THOUGHT  TOOL_CALLS  TOTAL   CACHE_HIT%  THINK_RATIO%  DURATION
───────          ────────  ─────  ─────   ──────  ──────  ───────  ──────────  ─────   ──────────  ────────────  ────────
total            3         186    10.7M   23.1k   9.9M    55.5k    0           10.8M   91.8%       70.7%         35m 54s
cm find --quick  1         33     2.0M    9.4k    1.8M    15.2k    0           2.1M    90.6%       61.8%         05m 44s
cm fix           1         33     870.9k  908     678.6k  20.3k    0           892.2k  77.9%       95.7%         04m 40s
cm verify        1         120    7.8M    12.7k   7.3M    20.0k    0           7.9M    93.6%       61.1%         25m 31s

3 turn(s) across 3 command type(s) in the last 7 days
2026-10-22T02:24:46Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261022T022446Z_pending.log

Krok 4. Wygeneruj i wyświetl podgląd interaktywnego raportu HTML (cm report -f html)

Wyeksportuj wyniki skanowania i zastosowane poprawki jako samodzielny, interaktywny panel HTML:

cm report -f html
cp ~/.codemender/reports/report.html ./report.html

Aby wyświetlić report.html w Google Cloud Shell:

Uruchom lokalny serwer WWW do podglądu w terminalu Cloud Shell:

python3 -m http.server 8080

Na pasku narzędzi w prawym górnym rogu Cloud Shell kliknij przycisk Podgląd w przeglądarce (ikona z okiem/ekranem) ➔ Podejrzyj na porcie 8080, aby wyświetlić interaktywny panel zgodności w przeglądarce.

(Alternatywnie) W eksploratorze plików edytora Cloud Shell kliknij prawym przyciskiem myszy report.html i wybierz Pobierz, aby wyświetlić plik w przeglądarce lokalnej.

Krok 5. Najważniejsze funkcje wygenerowanego interaktywnego raportu HTML

Poniżej znajdziesz zestawienie najważniejszych elementów wygenerowanego interaktywnego raportu HTML (report.html):

Omówienie panelu zgodności ze standardami bezpieczeństwa CodeMender

1. Nagłówek wskaźników wykonawczych i karty stanu

Nagłówek wskaźników wykonawczych i karty stanu CodeMenderMetadane nagłówka: wyświetla szczegóły docelowego repozytorium (OWASP Juice Shop), łączną liczbę przeskanowanych plików źródłowych (684 files) i sygnaturę czasową wygenerowania w formacie UTC.

Siatka kart danych: zapewnia natychmiastowy ogólny przegląd wszystkich wyników, rozkładu wag (CRITICAL, HIGH, MEDIUM, LOW) i wszystkich naprawionych luk w zabezpieczeniach (FIXED).

2. Interaktywna tabela podsumowania wyników

Tabela podsumowania wyników CodeMenderMacierz luk w zabezpieczeniach: wyświetla tabelę z możliwością filtrowania, która zawiera te informacje: ID, Severity, Status (OPEN w porównaniu z FIXED), CWE Type, File Location, Vulnerability Title i Confidence Score.

3. Dogłębna analiza głównej przyczyny i fragment kodu źródłowego z luką w zabezpieczeniach

Analiza głównej przyczyny i fragment kodu CodeMenderAnaliza zwijana (RCA): kliknięcie dowolnego wiersza wyników powoduje rozwinięcie szczegółowej analizy głównej przyczyny, która została wygenerowana przez model rozumowania Gemini dotyczący bezpieczeństwa.

Fragment kodu źródłowego z luką w zabezpieczeniach: wyświetla dokładne numery wierszy i kod źródłowy z wyróżnioną składnią wokół ujścia z luką w zabezpieczeniach.

4. Syntetyzowane różnice w poprawkach naprawczych AI

Różnice w wygenerowanej przez CodeMender poprawce naprawczejWidok ujednoliconego porównania: w przypadku usuniętych luk w zabezpieczeniach (FIXED) CodeMender renderuje ujednolicony blok porównania, w którym zastosowane dodatki do kodu aplikacji są wyróżnione na zielono (+), a usunięty kod z lukami w zabezpieczeniach – na czerwono (-).

Krok 6. (Opcjonalnie) Zaimportuj wyniki SAST innej firmy (cm report import)

CodeMender nie ogranicza się do błędów wykrytych przez własny skaner. Zespoły mogą importować wyniki zewnętrznych testów SAST (np. z Semgrep, Snyk, SonarQube lub Fortify) za pomocą standardowego schematu JSON lub interaktywnego kreatora, co pozwala CodeMender natychmiast weryfikować i syntetyzować poprawki:

# Create a sample third-party findings JSON file
cat << 'EOF' > ./findings.json
[
 {
   "file_path": "routes/basket.ts",
   "line": 18,
   "title": "SQL Injection in Basket Handler",
   "message": "Raw basket ID concatenated in query",
   "severity": "HIGH",
   "vuln_type": "CWE-89"
 }
]
EOF

# Ingest findings into CodeMender state database
cm report import --file ./findings.json

Dane wyjściowe:

Successfully imported 1 findings.
2026-10-22T02:27:10Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261022T022710Z_pending.log

10. Czyszczenie zasobów

⏱️ Czas trwania: 1:00

Aby uniknąć niepotrzebnego wykorzystania dysku w środowisku Google Cloud Shell i wyczyścić tymczasowe zasoby warsztatowe, wykonaj te czynności.

Krok 1. Wyczyść lokalną pamięć podręczną CodeMender i usuń repozytorium

CodeMender udostępnia wbudowane polecenie cm clean do czyszczenia lokalnej bazy danych wyników (~/.codemender/state.db), raportów HTML i plików kopii zapasowej kodu źródłowego. W Cloud Shell uruchom te polecenia:

# Purge local SQLite findings cache, HTML reports, and backup files
cm clean

# Remove cloned repository
cd ~
rm -rf ~/juice-shop

Krok 2. (Opcjonalnie) Wyłącz interfejsy Google Cloud API

Jeśli nie planujesz używać interfejsów CodeMender ani Agent Platform API w tym projekcie do dalszego rozwoju, możesz wyłączyć interfejsy API usługi:

gcloud services disable \
 aiplatform.googleapis.com \
 cloudresourcemanager.googleapis.com \
 --project=${PROJECT_ID}

11. Gratulacje

⏱️ Czas trwania: 2:00

Gratulacje! Udało Ci się przekształcić OWASP Juice Shop z aplikacji celowo podatnej na ataki w bezpieczną bazę kodu za pomocą CodeMender na platformie Gemini Enterprise Agent Platform w Google Cloud.

Omówione zagadnienia

Autonomiczne działania naprawcze w pętli zamkniętej: CodeMender nie ogranicza się do pasywnego generowania alertów statycznych, ale realizuje kompletny, samodzielny cykl życia zabezpieczeń – od wykrywania repozytoriów (cm find) po weryfikację exploitów w piaskownicy (cm verify) i syntezę poprawek przetestowanych pod kątem regresji (cm fix).

Dowody na wykorzystanie luk w zabezpieczeniach oparte na dowodach: dzięki przechwytywaniu namacalnych artefaktów weryfikacyjnych (PLAN.md, LOG.md, exploit.sh, REPORT.md) CodeMender eliminuje fałszywe alarmy i udowadnia możliwość wykorzystania luk w zabezpieczeniach w świecie rzeczywistym przed napisaniem jakiegokolwiek kodu.

Poprawki uwzględniające kontekst i idiomatyczne: zamiast stosować ogólne zamienniki tekstu, agenty rozumujące Gemini analizują architekturę aplikacji, modele danych i ORM, aby tworzyć przejrzyste, łatwe w utrzymaniu poprawki (takie jak sparametryzowane zapytania Sequelize), które zachowują istniejącą logikę biznesową.

Wbudowane zabezpieczenia i testy: każda proponowana poprawka jest automatycznie sprawdzana pod kątem zestawów testów projektu (npm test) i narzędzi do sprawdzania typów (tsc) w izolowanych piaskownicach obszaru roboczego, zanim zmiany zostaną wprowadzone.

Zmiana sposobu myślenia deweloperów

Tradycyjny ręczny przepływ pracy SAST

Autonomiczne rozwiązywanie problemów za pomocą CodeMender (cm)

Zmęczenie alertami: godziny spędzone na analizowaniu nieistotnych raportów z dużą liczbą wyników fałszywie pozytywnych.

Agentic Code Discovery (cm find .): szczegółowe, kontekstowe skanowanie repozytorium oparte na modelach Gemini.

Ręczna weryfikacja PoC: tworzenie niestandardowych ładunków curl i skryptów ataków w celu potwierdzenia luk w zabezpieczeniach.

Automated Exploit Proofs (cm verify ): automatyczna synteza wykonywalnych planów walidacji, logów i skryptów powłoki.

Ręczna refaktoryzacja o wysokim ryzyku: ręczne poprawianie złożonych zapytań do bazy danych, co często powoduje błędy składni lub błędy środowiska wykonawczego.

Idiomatic Patch Synthesis (cm fix ): generowanie różnic z uwzględnieniem kontekstu, dostosowane do istniejących standardów ORM i platform.

Ryzyko regresji w środowisku produkcyjnym: poprawki zabezpieczeń często psują logikę biznesową lub testy na dalszych etapach.

Automatyczne zabezpieczenia testów: ciągła weryfikacja pod kątem lokalnych pakietów testów i izolowanych piaskownic procesów.

Ręczne kompilacje zgodności: ręczne agregowanie wyników w statycznych dokumentach na potrzeby kontroli.

Standardized Telemetry & SARIF (cm report -f sarif): natychmiastowy eksport OASIS SARIF v2.1.0, paneli HTML i statystyk tokenów.

Dalsze kroki

🚀 Kontynuuj trylogię CodeMender:

Część 2. Zabezpieczanie potoku CI/CD za pomocą CodeMender – automatyzacja ciągłego skanowania bez interfejsu graficznego, integracja panelu SARIF i samonaprawiające się żądania pull w GitHub Actions.

Część 3: bezpieczne vibe-coding z Antigravity i CodeMender – połącz programowanie z wykorzystaniem generatywnej AI z autonomicznym asystentem ds. bezpieczeństwa.

📖 Zapoznaj się z dokumentacją:

Dokumentacja CodeMender w Google Cloud

Rozwiązania Google Cloud Security

💡 Zastosowanie we własnych projektach:

Uruchamiaj cm find . i cm fix we własnych repozytoriach Node.js, Python, Go, Java, Rust lub C/C++.