1. Başlamadan önce
⏱️ Süre: 03:00
Google Cloud'un Gemini Enterprise Agent Platformu'nda CodeMender ile Uygulamanızın Güvenliğini Sağlama konulu uygulamalı codelab'e hoş geldiniz.
Bu atölyede, Node.js, Express, TypeScript ve Angular ile oluşturulmuş, kasıtlı olarak güvenlik açığı barındıran, endüstri standardı bir web uygulaması olan OWASP Juice Shop'u denetlemek ve güvenliğini sağlamakla görevli bir bulut güvenlik mühendisi rolünü üstleneceksiniz.
Geleneksel güvenlik tarama araçları (SAST/DAST), geliştirme ekiplerini binlerce statik güvenlik bulgusu, yüksek yanlış pozitif oranları ve uygulanabilir olmayan kod düzeltmeleriyle boğar. Geliştiriciler günlükleri önceliklendirmek, veri akışlarını izlemek ve mevcut uygulama davranışını sık sık bozan yamaları manuel olarak yazmak için saatler harcar.
CodeMender, Google'ın Gemini LLM'lerini ince ayarlı bir ajan düzeneğiyle sarmalayarak kod güvenliğinde devrim yaratır. Google DeepMind tarafından geliştirilen istemler, özel güvenlik becerileri ve çoklu temsilci koordinasyonu kullanan CodeMender, otonom bir yapay zeka güvenlik yardımcı geliştiricisi olarak çalışır. Yazılım güvenlik açıklarını doğrudan yerel kaynak depolarında bulur, doğrular ve giderir.
Ön koşullar
- Web uygulaması güvenlik açıkları (SQL yerleştirme ve XSS gibi OWASP ilk 10) hakkında temel bilgi sahibi olma
- JavaScript/TypeScript ve Node.js uygulamaları hakkında temel bilgi
- Komut satırı arayüzü (KSA) araçları hakkında temel bilgi sahibi olmak
Neler öğreneceksiniz?
- Google Cloud Shell'de CodeMender (
cm) KSA'yı kurma, kimlik doğrulama ve ilk kullanıma hazırlama. - Kötüye kullanılabilir güvenlik açıklarını (
cm find) keşfetmek için bir depoyu otonom olarak tarama - İzole edilmiş korumalı alanlardaki güvenlik açıklarını doğrulama ve doğrulama yapılarını inceleme (
cm verify). - Bağlama duyarlı güvenlik yamalarını otonom olarak sentezleme, test etme ve uygulama (
cm fix). - Jeton telemetrisini denetleme ve çok formatlı uyumluluk raporlarını (
cm stats,cm report) dışa aktarma
İhtiyacınız olanlar
- Faturalandırmanın etkin olduğu bir Google Cloud projesi
- Etkin proje bağlantısı olan Google Cloud Shell (önceden yüklenmiş
gcloud,gitve Node.js 18+ içerir) - Başlangıç deposu: OWASP Juice Shop GitHub deposu
2. CodeMender mimarisine giriş
⏱️ Süre: 04:00
Kod tarama ve düzeltme işlemlerine geçmeden önce, CodeMender'ın Gemini Enterprise Agent Platform'da resmi Google Cloud mimari standartlarına göre nasıl çalıştığını inceleyelim.
Sistem mimarisi: Aracı ve istemci arka plan programı

Kullanıcı açısından bakıldığında CodeMender iki ana mimari bileşenden oluşur:
Barındırılan Çoklu Temsilci Platformu: Google Cloud'da çalışan ve temel güvenlik iş mantığını, LLM istem mühendisliğini ve güvenlik mantığını yürüten, barındırılan çoklu temsilci sistemi.
Yerel İstemci KSA ve Korumalı Alan Arka Plan Programı (cm): Google Cloud Shell'de çalışan ve hem KSA (cm find, cm verify, cm fix gibi komutları vermek için) hem de yerel arka plan programı (izole edilmiş bir işlem düzeyinde korumalı alanda temsilci adına komutları güvenli bir şekilde yürütmek için) olarak görev yapan bir istemcidir.
3 temel düzeltme özelliği

CodeMender, kod güvenliğini üç entegre aşamada yönetir:
Güvenlik Açıklarını Bulma (cm find): Temsilci tarafından yönlendirilen bir LLM kullanarak kod tabanlarını tarar. Modelin güvenlik açıklarına odaklanması için özel güvenlik araçlarından ve istem mühendisliğinden yararlanır. (Alternatif olarak, bulgular harici güvenlik tarama araçlarından içe aktarılabilir).
Güvenlik Açıklarını Doğrulama (cm verify): Kodu yerel olarak derler ve keşfedilen kusurların kötüye kullanılıp kullanılamayacağını doğrulamak için bunları kötüye kullanmaya çalışır. Bu sayede yanlış pozitifler ortadan kalkar ve .exploit/ (info.yaml, PLAN.md, LOG.md, exploit.sh, REPORT.md) içinde kalıcı çalışma alanı doğrulama yapıları oluşturulur.
Güvenlik Açıklarını Düzeltme (cm fix): Dile duyarlı kaynak yamalarını sentezler ve yerel korumalı alanda proje derleme ve regresyon testi paketlerini (npm test) çalıştırarak doğrular.
3. OWASP Juice Shop ortamını ayarlama
⏱️ Süre: 05:00
Bu adımda, Google Cloud terminal ortamınızı açacak ve hedef uygulama deposunu getireceksiniz.
1. adım: Google Cloud Console'da Cloud Shell'i açın
Tarayıcınızda Google Cloud Console'a gidin.
Üst gezinme çubuğunda Cloud Shell'i etkinleştir düğmesini (>_ simgesi) tıklayın.
Cloud Shell, gcloud, git ve Node.js önceden yüklenmiş ve kimliği doğrulanmış şekilde tarayıcı tabanlı bir Linux terminali sunar.
2. adım: OWASP Juice Shop deposunu klonlayın
Cloud Shell veya yerel terminalinizde OWASP Juice Shop deposunu klonlayın:
git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop
3. adım: Önemli uygulama dosyalarını inceleyin
OWASP Juice Shop, arka uçta TypeScript modülleriyle Express.js kullanır. Dizin yapısına hızlıca göz atın:
ls -la routes/ lib/
Kimlik doğrulama, kullanıcı sorguları ve alışveriş sepeti yönetimini gerçekleştiren ana rota dosyalarını inceleyin:
routes/login.ts: Kullanıcı kimlik doğrulamasını ve ham SQL sorgusu yürütme işlemlerini yönetir.
routes/search.ts: Ürün arama ve yanıt oluşturma işlemlerini gerçekleştirir.
routes/basket.ts: Kullanıcının alışveriş sepetini alma işlemini gerçekleştirir.
routes/trackOrder.ts: NoSQL sorguları aracılığıyla sipariş takibini yönetir.
lib/xml.ts: XML ayrıştırma ve dosya yükleme işlemlerini gerçekleştirir.
lib/insecurity.ts: Oturum jetonları ve şifreleme için yardımcı araçlar.
4. CodeMender KSA'yı (cm) yükleme ve GCP kimlik bilgilerini doğrulama
⏱️ Süre: 08:00
Bu adımda, gerekli Google Cloud API'lerini etkinleştirecek, gcloud kullanarak IAM izinleri verecek, cm CLI ikili programını indirip yükleyecek ve Uygulama Varsayılan Kimlik Bilgileri'ni (ADC) yapılandıracaksınız.
1. adım: Gerekli Google Cloud API'lerini gcloud üzerinden etkinleştirin
CodeMender, Gemini Enterprise Agent Platform'da Agent Platform API (aiplatform.googleapis.com) ve Cloud Resource Manager API'yi (cloudresourcemanager.googleapis.com) gerektirir.
Cloud Shell'de veya terminalinizde etkin proje kimliğinizi alın (veya Google Cloud Console'un üst kısmındaki proje açılır listesini kontrol edin) ve gerekli hizmet API'lerini etkinleştirin:
# 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}
API'lerin etkinleştirildiğini doğrulayın:
gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"
2. adım: gcloud aracılığıyla IAM izinleri verin
Kullanıcıların ve hizmet hesaplarının CodeMender bulut akıl yürütme motoruyla etkileşim kurabilmesi için roles/aiplatform.user (Temsilci Platformu Kullanıcısı) IAM rolünün atanması gerekir.
CLI üzerinden kullanıcı hesabınıza IAM rolü verme
# 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"
3. adım: cm KSA'yı Cloud Shell'e indirip yükleyin.
Google Cloud Shell'de kullanıcı verileri, $HOME dizininizde kalıcı depolama alanında depolanır. sudo gerektirmeden cm aracını ~/bin ortamına yüklemek için aşağıdaki komutları çalıştırın. Önceki bölümden itibaren hâlâ ~/juice-shop dizininde olduğunuz için komutlar geçici bir dizine indirilir ve daha sonra temizlenir. Böylece Juice Shop deposunda yükleyici dosyası kalmaz:
# 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
4. adım: cm CLI kurulumunu doğrulayın
CLI ikili dosyasının doğru şekilde yüklendiğini doğrulamak için cm --version komutunu çalıştırın:
cm --version
Beklenen çıktı:
cm version 0.17.0
5. adım: Google Cloud Uygulama Varsayılan Kimlik Bilgileri'ni (ADC) yapılandırın
cm, bulut akıl yürütme motoruna gönderilen isteklerin kimliğini doğrulayabilsin diye Google Cloud Uygulaması Varsayılan Kimlik Bilgileri'ni (ADC) yapılandırın:
gcloud auth application-default login
Cloud Shell'i yetkilendir etiketli bir yetkilendirme kalıcı iletişim kutusu görünür. Erişim izni vermek için Yetkilendir'i tıklayın.
5. CodeMender çalışma alanını başlatma ve doğrulama
⏱️ Süre: 03:00
cm yüklendi ve kimliği doğrulandı. Şimdi hedef proje dizininde CodeMender çalışma alanını ilk kullanıma hazırlayacak ve ortam kurulumunuzu doğrulayacaksınız.
1. adım: CodeMender çalışma alanını başlatın (cm init)
Yerel durum izleme dosyalarını ilk kullanıma hazırlamak ve temel yapılandırmaları oluşturmak için proje dizininizin kökünden cm init komutunu çalıştırın:
cm init
Çıkış:
✅ Initialized CodeMender workspace at /home/user/.codemender
2. adım: Uçtan uca durum teşhisi yapın (cm health)
Temsilci oturumu başlatmadan önce kimlik bilgilerinizi, yapılandırmanızı, erişilebilirliğinizi ve yetkilendirmenizi doğrulamak için cm health komutunu çalıştırın:
cm health
Çıkış:
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)
3. adım: Yapılandırma parametrelerini anlama (config.yaml)
CodeMender, .codemender/config.yaml (veya ~/.codemender/config.yaml) konumunda bir çalışma alanı yapılandırma dosyası oluşturur. Bu dosya; politika sınırlarını, dosya dahil etme kurallarını ve test doğrulama kancalarını tanımlar:
# 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. cm find ile güvenlik açıklarını keşfedin .
⏱️ Süre: 07:00
Bu adımda, Juice Shop kod tabanında temsilci tabanlı güvenlik taraması yapmak için cm find . --quick aracını çalıştıracaksınız.
1. adım: cm find . --quick komutunu çalıştırın.
CodeMender v0.16.0'dan itibaren cm find <path> varsayılan olarak Derin Tarama (
--deep
), kapsamlı bir dosya analizi yaparken Hızlı Tarama (
--quick
), hızlı depo triyajı sağlar. OWASP Juice Shop deposunda hızlı tarama yapmak için cm find . --quick komutunu çalıştırın (Tahmini yürütme süresi: 684 dosyalık tam kod tabanı triyajı için yaklaşık 8 dakika):
cm find . --quick -y --sandbox=false --bypass-warning --model gemini-3.8-flash
cm, Gemini Enterprise Agent Platform'da bir tarama oturumu başlatarak tüm depo modüllerindeki kaynak kodu dosyalarını analiz eder:
⚠️ 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
2. adım: Tarama bulgularını cm report üzerinden inceleyin.
Yerel SQLite durum veritabanından keşfedilen tüm güvenlik bulgularını görüntülemek için cm report -f table komutunu çalıştırın:
cm report -f table
Çıkış:
┌──────────┬───────────┬──────┬───┬──────────────────────────────┬────────────────────────────────────────┐ │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
3. adım: Bulguların yaşam döngüsü durumlarını ve önem derecelerini anlama
CodeMender, güvenlik açıklarını dört aşamalı resmi bir yaşam döngüsü üzerinden takip eder:
Bulgu Durumu | Anlam ve Geçiş İşleme |
| Güvenlik açığı keşfedildi (veya içe aktarıldı) ancak henüz doğrulanmadı, yamalanmadı veya reddedilmedi. |
| CodeMender bir yama oluşturdu, farkı uyguladı ve derleme/test paketlerinin başarılı olduğunu ve açıkların başarısız olduğunu doğruladı. |
| Düşük güven, tehdit modelinin dışında olması veya yanlış pozitif olarak doğrulanması nedeniyle etkin değil olarak işaretlendi. Gelecekteki uyarıların sesini kapatır. |
| Daha sonraki bir taramada yeniden tespit edilen, daha önce |
Önem derecesi sınıflandırmaları
🔴 CRITICAL: Güvenilmeyen sınırlardan doğrudan erişilebilen acil ve ciddi risk (ör. uzaktan kod yürütme, kimliği doğrulanmamış SQL yerleştirme).
🟠 HIGH: Belirli bir kullanıcı bağlamı veya zincirleme koşullar gerektiren ciddi kusur (ör. rastgele veritabanı okuma, ayrıcalık artırma).
🟡 MEDIUM: Kapsamı kısıtlanmış olan veya kullanıcı etkileşimi gerektiren orta düzey risk (ör. açık yönlendirme, CSRF).
🔵 LOW: Doğrudan etkisi minimum düzeyde olan derinlemesine savunma hijyeni kusurları veya keşif vektörleri.
7. Güvenlik açıklarını doğrulama ve yakalanan doğrulama yapılarını inceleme
⏱️ Süre: 10:00
CodeMender'ın temel özelliklerinden biri, cm verify komutunu her çalıştırdığınızda kalıcı doğrulama yapılarını otomatik olarak oluşturmasıdır. routes/login.ts (bu eğitimde 43aa7446 olarak gösterilir) projesindeki kritik SQL yerleştirme bulgusunu doğrulayalım ve temsilci tarafından oluşturulan yapıları inceleyelim.
1. adım: cm verify <login-finding-id> komutunu çalıştırın.
cm report tablonuzda (ör. 43aa7446) routes/login.ts için bulgu kimliğini bulun ve cm verify <finding-id> --sandbox=false --bypass-warning -y komutunu çalıştırın (Tahmini yürütme süresi: Otonom araç adımlarını çalıştırmak, arka plan hizmetlerini başlatmak ve canlı PoC istismar komut dosyalarını yürütmek için yaklaşık 20 dakika):
# 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
Çıkış:
⚠️ 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
2. adım: Yakalanan doğrulama yapılarına genel bakış
CodeMender v0.16.0 sürümünden itibaren doğrulama yapıları, .exploit/ altındaki depo kökünde standartlaştırılırken ~/.codemender/artifacts/<session-id>/ içinde kalıcı bir kopya saklanır. Bunlar, düzeltmenizin bir parçası olmaktan ziyade yerel çalışma dosyalarıdır. Bu nedenle, bir sonraki bölümde yamayı hazırlamadan önce bunları Git'ten hariç tutacaksınız. Bunları listelemek için ls -la .exploit/ komutunu çalıştırın:
ls -la .exploit/
Çıkış:
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
Yapı dosyası | Kategori | Purpose |
| Meta Veri Manifesti | Bulgu UUID'sini, başlığını, önem derecesini ( |
| Temsilci Stratejisi | CodeMender akıl yürütme motoru tarafından otonom olarak yürütülen adım adım doğrulama planı ve yapılacaklar listesi. |
| Yürütme İzleme Günlüğü | Her araç çağrısını, HTTP istek uç noktasını ve test sonucunu kaydeden zaman damgalı denetim kaydı. |
| Yardımcı Çalıştırıcı/Sunucu Günlüğü | Temsilcinin test için Juice Shop'u başlatmak üzere oluşturduğu yardımcı komut dosyası ve yakalanan sunucu çıkışı. |
| Yürütme sarmalayıcısı/Bağımsız PoC | Hedef hizmeti başlatan ve PoC istemcisini çağırarak HTTP 200 yanıtlarını doğrulayan kabuk komut dosyası sarmalayıcısı. |
| Temel Neden Analizi | Yönetici özeti, satır satır güvenlik açığı analizi, ham SQL dökümü ve Sequelize parametreleştirme önerileri. |
3. adım: Doğrulama öğesiyle ilgili önemli noktaların ayrıntılı açıklaması
Temsilci, her çalıştırmada bu yapıları yeniden oluşturur. Bu nedenle, tam içerikleri her seferinde farklı olur. Bu dosyaları Cloud Shell Düzenleyici'de (veya cat ile) açın ve aşağıdakileri arayın:
Öğe | Nelere dikkat edilmeli? |
| Bulgunun tam kimliği, başlığı, önem derecesi, güven düzeyi ve |
| Temsilcinin, bildirilen dosyayı okumaktan yeniden oluşturma komut dosyasını yazmaya kadar izlediği yapılacaklar listesi. |
| Yeniden oluşturma komut dosyasının her çalıştırılmasının sonucu da dahil olmak üzere zaman damgalı işlemler ve sonuçlar. |
| Bağımsız yeniden oluşturma komut dosyası: Uygulamayı nasıl başlattığı, hangi uç noktayı hedeflediği ve başarıya nasıl karar verdiği ( |
| Temsilcinin test için Juice Shop'u başlatmak üzere oluşturduğu yardımcı dosyalar ve bu sunucunun çıkışı. |
| Temel neden analizi: |
8. cm fix ile SQL yerleştirme sorununu giderme
⏱️ Süre: 10:00
routes/login.ts (örnek kimliği 43aa7446) içindeki SQL yerleştirme bulgusunu doğrulayıp yapılarını incelediğimize göre, otomatik parametreli sorgu yaması uygulamak için cm fix komutunu çalıştıralım.
1. adım: cm fix <login-finding-id> -y komutunu çalıştırın.
Bir düzeltme oluşturup uygulamak için cm fix <finding-id> --sandbox=false --bypass-warning -y komutunu çalıştırın (43aa7446 ifadesini cm report sayfasındaki gerçek giriş bulgusu kimliğinizle değiştirin):
# Replace 43aa7446 with your actual login.ts finding ID
cm fix 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash
Çıkış:
⚠️ 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
2. adım: cm vcs komutunu kullanarak VCS durumunu ve farkı inceleyin.
Değiştirilen çalışma alanı dosyalarını görüntülemek için cm vcs status ve cm vcs diff komutlarını çalıştırın:
cm vcs status
cm vcs diff
Çıkış:
📂 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
İzlenmeyen iki giriş, CodeMender'ın yerel dosyalarıdır ve düzeltmenin bir parçası değildir: .exploit/, cm verify'den gelen doğrulama yapılarını barındırır ve .cm_project, CodeMender için proje kökünü işaretler. Bir sonraki adımda bunları commit'inizin dışında tutacaksınız.
Ve 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 !== '') {
3. adım: Doğrulanmış yamayı cm vcs stage ile hazırlayın
Birleştirilmiş farkı inceleyip düzeltmenin kalite ve güvenlik standartlarınızı karşıladığını onayladıktan sonra yamayı kaydetmek için hazırlayın. cm vcs stage, git add -A komutunu çalıştırdığı için çalışma ağacındaki her değişikliği (2. adımdaki izlenmeyen .exploit/ ve .cm_project girişleri dahil) hazırlar. Öncelikle, yalnızca yamanın hazırlanması için bunları Git'in hiçbir zaman kaydetmediği, yalnızca yerel olarak erişilebilen bir yoksayma dosyası olan .git/info/exclude dosyasına ekleyin:
# Keep CodeMender's local files out of Git (local-only; not committed)
printf '.exploit/\n.cm_project\n' >> .git/info/exclude
Ardından, cm vcs stage kullanarak değişiklikleri hazırlayın:
cm vcs stage
Çıkış:
📦 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.
Git'te yalnızca yamanın hazırlandığını doğrulayın:
cm vcs status
Çıkış:
📂 CodeMender VCS Status ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git status --short ────────────────────────────────────────────────── M routes/login.ts
.git/info/exclude dosyasını güncellemeden önce cm vcs stage komutunu çalıştırdıysanız git restore --staged .exploit .cm_project komutuyla CodeMender dosyalarını hazırlama aşamasından çıkarın. Dosyalar diskte kalır, yalnızca hazırlama alanından kaldırılır.
4. adım: Yamayı uygulayın ve doğrulama yapılarını temizleyin
Bir sonraki bulguyu düzeltmeden önce hazırlanan yamayı uygulayın: Her cm fix ve cm verify çalıştırması, çalışma alanını sıfırlayarak (git checkout HEAD -- . && git clean -fd) başlar ve uygulanmamış değişiklikleri siler. Ardından, bir sonraki düzeltmenin temiz bir çalışma alanından başlaması için yerel .exploit/ klasörünü silin. .exploit/ artık yoksayıldığı için git clean -fd bu öğeyi sizin için kaldırmaz. Yapıların kalıcı bir kopyası ~/.codemender/artifacts/<session-id>/ içinde kalır.
git commit -m "fix: use parameterized query in login route"
rm -rf .exploit/
Git kimliğinizi sorarsa depoda git config user.name "Your Name" ve git config user.email "you@example.com" komutlarını çalıştırın, ardından tekrar kaydedin.
9. Yamaları doğrulama, oturumları yönetme ve raporları dışa aktarma (cm raporu)
⏱️ Süre: 08:00
Yapay zeka tarafından oluşturulan bir güvenlik düzeltmesini uyguladıktan sonra, cm report kullanarak etkin oturumları yönetmek, jeton kullanım istatistiklerini incelemek ve kurumsal güvenlik uygunluk raporları oluşturmak önemlidir.
1. adım: Durum bilgisi olan oturumları yönetme (cm session list / resume / cancel)
CodeMender; her tarama, doğrulama ve düzeltme görevini yerel SQLite veritabanında (~/.codemender/state.db) durum bilgisi olan bir oturum olarak izler. Oturumlarınızı incelemek için cm session list komutunu çalıştırın:
cm session list
Çıkış:
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
2. adım: Düzeltilen bulguları doğrulamak için cm report komutunu çalıştırın.
Güncellenen bulgu durumlarını görüntülemek için cm report -f table komutunu çalıştırın (giderilen bulguların artık Fix sütununda ✅ applied ile FIXED olarak gösterildiğine dikkat edin):
cm report -f table
Çıkış:
┌──────────┬───────────┬──────┬──────────┬──────────────────────────────┬────────────────────────────────────────┐ │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
3. adım: cm stats kullanarak jeton kullanımını kontrol edin
Tarama modlarında (cm find --quick, cm verify ve cm fix) yerel jeton tüketimini incelemek için cm stats komutunu çalıştırın:
cm stats
Çıkış:
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
4. adım: Etkileşimli HTML raporunu oluşturun ve önizleyin (cm report -f html)
Tarama bulgularınızı ve uygulanan yamaları bağımsız, etkileşimli bir HTML kontrol paneli olarak dışa aktarın:
cm report -f html
cp ~/.codemender/reports/report.html ./report.html
report.html öğesini Google Cloud Shell'de görüntülemek için:
Cloud Shell terminalinizde yerel bir önizleme web sunucusu başlatın:
python3 -m http.server 8080
Cloud Shell'in sağ üstteki araç çubuğunda Web Önizlemesi düğmesini (göz/ekran simgesi) ➔ 8080 bağlantı noktasında önizle'yi tıklayarak etkileşimli uygunluk kontrol panelini tarayıcınızda görüntüleyin.
(Alternatif) Cloud Shell Düzenleyici dosya gezgininde report.html dosyasını sağ tıklayın ve dosyayı yerel tarayıcınızda görüntülemek için Download'u (İndir) tıklayın.
5. adım: Oluşturulan etkileşimli HTML raporunun temel özellikleri
Oluşturulan etkileşimli HTML raporunun (report.html) temel bileşenleri aşağıda açıklanmıştır:

1. Yönetici metrikleri başlığı ve durum kartları
Üstbilgi Meta Verileri: Hedef depo ayrıntılarını (OWASP Juice Shop), taranan toplam kaynak dosya sayısını (684 files) ve UTC oluşturma zaman damgasını gösterir.
Metrik Kartları Tablosu: Toplam bulgular, önem derecesi dağılımları (CRITICAL, HIGH, MEDIUM, LOW) ve düzeltilen toplam güvenlik açığı (FIXED) hakkında anında üst düzey bir genel bakış sunar.
2. Etkileşimli bulgular özeti tablosu
Güvenlik Açığı Matrisi: ID, Severity, Status (OPEN ve FIXED), CWE Type, File Location, Vulnerability Title ve Confidence Score bilgilerini içeren filtrelenebilir bir tablo gösterir.
3. Derinlemesine kök neden analizi ve güvenlik açığı bulunan kaynak kodu snippet'i
Daraltılabilir analiz (RCA): Herhangi bir bulgu satırını tıkladığınızda, Gemini güvenlik akıl yürütme modeli tarafından sentezlenen ayrıntılı kök neden analizi genişletilir.
Güvenlik Açığı Bulunan Kaynak Kodu Snippet'i: Güvenlik açığı bulunan havuzun etrafındaki tam satır numaralarını ve söz dizimi vurgulanmış kaynak kodunu gösterir.
4. Sentezlenmiş yapay zeka düzeltme yaması farkları
Birleştirilmiş Fark Görünümü: CodeMender, giderilen güvenlik açıkları (FIXED) için uygulanan kod eklemelerini yeşil (+) ve kaldırılan güvenlik açığı bulunan kodu kırmızı (-) renkle vurgulayan birleştirilmiş bir fark bloğu oluşturur.
6. adım: (İsteğe bağlı) Üçüncü taraf SAST bulgularını içe aktarın (cm report import)
CodeMender, kendi tarayıcısı tarafından keşfedilen kusurlarla sınırlı değildir. Ekipler, standartlaştırılmış bir JSON şeması veya etkileşimli sihirbaz kullanarak harici SAST sonuçlarını (ör.Semgrep, Snyk, SonarQube veya Fortify'dan) içe aktarabilir. Böylece CodeMender, bu sonuçları hemen doğrulayabilir ve düzeltmeleri sentezleyebilir:
# 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
Çıkış:
Successfully imported 1 findings. 2026-10-22T02:27:10Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022710Z_pending.log
10. Kaynakları temizleme
⏱️ Süre: 01:00
Google Cloud Shell ortamınızda gereksiz disk kullanımını önlemek ve geçici atölye kaynaklarını temizlemek için aşağıdaki temizleme adımlarını uygulayın.
1. adım: CodeMender yerel önbelleğini temizleyin ve depoyu kaldırın
CodeMender, yerel bulgular veritabanını (~/.codemender/state.db), HTML raporlarını ve kaynak yedek dosyalarını temizlemek için yerleşik bir cm clean komutu sağlar. Cloud Shell'de aşağıdaki komutları çalıştırın:
# Purge local SQLite findings cache, HTML reports, and backup files
cm clean
# Remove cloned repository
cd ~
rm -rf ~/juice-shop
2. adım: (İsteğe bağlı) Google Cloud API'lerini devre dışı bırakın
Bu projede daha fazla geliştirme yapmak için CodeMender veya Agent Platform API'lerini kullanmayı planlamıyorsanız hizmet API'lerini devre dışı bırakabilirsiniz:
gcloud services disable \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
--project=${PROJECT_ID}
11. Tebrikler
⏱️ Süre: 02:00
Tebrikler! Google Cloud'un Gemini Enterprise Agent Platform'unda CodeMender'ı kullanarak OWASP Juice Shop'u kasıtlı olarak güvenlik açığı bulunan bir uygulamadan sağlamlaştırılmış ve güvenli bir kod tabanına dönüştürdünüz.
İşlediğiniz konular
Otonom Kapalı Döngü Çözümleme: CodeMender, depo keşfinden (cm find) korumalı alan güvenlik açığı doğrulamasına (cm verify) ve regresyon testi yapılmış yama sentezine (cm fix) kadar eksiksiz, kendi kendini yöneten bir güvenlik yaşam döngüsü yürüterek pasif statik uyarı gürültüsünün ötesine geçer.
Kanıta Dayalı İstismar Kanıtları: CodeMender, somut doğrulama yapılarını (PLAN.md, LOG.md, exploit.sh, REPORT.md) yakalayarak yanlış pozitifleri ortadan kaldırır ve herhangi bir kod yazmadan önce gerçek dünyadaki istismar edilebilirliği kanıtlar.
Bağlama duyarlı, deyimsel düzeltmeler: Gemini akıl yürütme temsilcileri, genel metin değişiklikleri uygulamak yerine uygulama mimarisini, veri modellerini ve ORM'leri analiz ederek mevcut iş mantığını koruyan temiz, bakımı kolay yamalar (ör. parametreleştirilmiş Sequelize sorguları) üretir.
Yerleşik güvenlik ve test önlemleri: Önerilen her düzeltme, değişiklikler hazırlanmadan önce izole edilmiş çalışma alanı korumalı alanlarında proje test paketleri (npm test) ve tür denetleyicileri (tsc) ile otomatik olarak doğrulanır.
Geliştirici zihniyetinde değişim
Geleneksel Manuel SAST İş Akışı | CodeMender (cm) ile Otonom Çözüm |
Uyarı yorgunluğu: Yanlış pozitif oranı yüksek olan gürültülü raporları önceliklendirmek için saatler harcanır. | Agentic Code Discovery ( |
Manuel PoC Doğrulaması: Güvenlik açıklarını doğrulamak için özel curl yükleri ve saldırı komut dosyaları oluşturma. | Otomatik İstismar Kanıtları ( |
Yüksek Riskli Manuel Yeniden Düzenleme: Karmaşık veritabanı sorgularını manuel olarak yamalamak, genellikle söz dizimi veya çalışma zamanı hatalarına neden olur. | Idiomatic Patch Synthesis ( |
Üretim Regresyonu Riskleri: Güvenlik yamaları genellikle alt iş mantığını veya testleri bozar. | Otomatik Test Sınırları: Yerel test paketleri ve izole edilmiş işlem korumalı alanlarına karşı sürekli doğrulama. |
Manuel Uygunluk Derlemeleri: Bulguları denetim incelemeleri için manuel olarak statik belgelerde toplama. | Standartlaştırılmış Telemetri ve SARIF ( |
Sonraki adımlar
🚀 CodeMender üçlemesine devam edin:
2. Bölüm: CI/CD Ardışık Düzeninizi CodeMender ile Güvenceye Alma: GitHub Actions'da sürekli başsız taramayı, SARIF kontrol paneli entegrasyonunu ve kendi kendini onaran pull isteklerini otomatikleştirin.
3. Bölüm: Antigravity ve CodeMender ile Güvenli Sezgisel Kodlama: Üretken yapay zeka geliştirmeyi otonom bir güvenlik asistanıyla birleştirin.
📖 Belgeleri inceleyin:
Google Cloud Belgeleri'nde CodeMender
Google Cloud Güvenlik Çözümleri
💡 Kendi projelerinize uygulama:
Kendi Node.js, Python, Go, Java, Rust veya C/C++ depolarınızda cm find . ve cm fix komutlarını çalıştırın.