Secure Code Review ile Otomatik SAST Taraması Farkı
SAST kurallarla ifade edilebilen code pattern ve data flow'ları ölçekli biçimde tarar. Secure Code Review ise security requirement, business logic ve implementation context'ini insan muhakemesiyle değerlendirir.
SECNODEX Güvenlik Ekibi
Ofansif Güvenlik
Aynı source code iki farklı güvenlik çalışmasından geçiriliyor. Otomatik SAST taraması yüzlerce finding üretiyor. Bunların önemli bir bölümü false positive veya düşük riskli security hotspot olarak kapanıyor. Secure Code Review ise daha az sayıda bulgu çıkarıyor, fakat içlerinden biri bütün tenant'ları etkileyen merkezi bir authorization hatasını gösteriyor. Bir diğeri ödeme akışında aynı işlemin iki kez tamamlanmasına izin veren race condition'ı, üçüncüsü ise identity provider ulaşılamadığında authentication kontrolünün fail-open davranmasını ortaya koyuyor.
İlk bakışta iki sonuç birbirini tutmuyor gibi görünür.
SAST neden kritik business logic hatasını bulamadı? Manual reviewer yüzlerce riskli API kullanımını nasıl gözden kaçırdı? Hangisinin coverage'ı daha iyi? Hangisine güvenmek gerekir?
Sorun çoğu zaman çalışmalardan birinin başarısız olması değildir. İki yöntem aynı source code'a bakar, fakat aynı kanıtı üretmez.
Kısa cevap
Otomatik SAST taraması, source code içinde rule ile tanımlanabilen riskli pattern'leri ve source-to-sink data flow'ları geniş ölçekte arar. Secure Code Review ise uygulamanın security requirement'larını, trust boundary'lerini, business rule'larını ve implementation context'ini anlayarak kodun güvenlik açısından doğru davranıp davranmadığını inceler.
SAST'ın güçlü tarafı hız, tekrar edilebilirlik ve geniş coverage'dır. Secure Code Review'in güçlü tarafı context, niyet, root cause ve uygulamaya özgü riskleri anlamaktır. SAST aynı unsafe function'ın 350 kullanımını saniyeler veya dakikalar içinde bulabilir. İnsan reviewer ise o function'ın neden çağrıldığını, hangi user role için tehlikeli olduğunu ve başka bir güvenlik kontrolüyle nasıl etkileştiğini yorumlayabilir.
Bu nedenle doğru soru “SAST mı, Secure Code Review mi?” değildir. Doğru soru şudur:
Kısa cevap
Hangi güvenlik problemini, hangi kanıt seviyesiyle, development'ın hangi aşamasında ve hangi coverage beklentisiyle bulmaya çalışıyoruz?
Bu yazıda Secure Code Review ile otomatik SAST taraması farkını yalnızca “insan ve tool” karşılaştırmasıyla ele almayacağız. İki yöntemin nasıl çalıştığını, hangi vulnerability sınıflarında ayrıştığını, raporlarının neden farklı olması gerektiğini, false positive ve false negative problemlerini ve ikisinin birlikte nasıl ölçeklenebileceğini teknik örneklerle inceleyeceğiz.
Önce terimleri birbirinden ayıralım
Piyasada “kaynak kod analizi”, “Secure Code Review”, “SAST”, “code scan” ve “manual review” ifadeleri zaman zaman birbirinin yerine kullanılıyor. Teklifte bu kelimelerin bulunması, hangi faaliyetin gerçekten yapılacağını göstermeyebilir.
Secure Code Review nedir?
Secure Code Review, source code'un security requirement ve threat scenario'lar açısından bir uzman tarafından sistematik biçimde incelenmesidir. Reviewer yalnızca syntax hatası veya bilinen dangerous function aramaz. Uygulamanın hangi varlığı koruduğunu, hangi input'a güvenildiğini, authorization kararının nerede verildiğini ve hata durumlarında güvenlik kontrolünün nasıl davrandığını anlamaya çalışır.
İyi bir Secure Code Review şu alanları ilişkilendirir:
- Architecture ve component sınırları
- Trust boundary'ler
- Authentication ve authorization modeli
- User role, tenant ve object ownership ilişkileri
- Sensitive data flow
- Input validation ve output encoding
- Cryptographic implementation ve key handling
- Session ve token lifecycle
- File, parser ve deserialization işlemleri
- External service ve webhook trust'i
- Error handling ve fail-open davranışı
- Concurrency, transaction ve state transition'lar
- Audit logging ve security event üretimi
- Business rule ve abuse case'ler
Secure Code Review, normal peer review ile de aynı şey değildir. Functional peer review kodun doğru çalışıp çalışmadığını, okunabilirliğini, maintainability'sini ve coding convention'lara uyumunu inceleyebilir. Security-focused review ise kötü niyetli input, yetkisiz kullanıcı, beklenmeyen sequence, bypass ve failure state üzerinden düşünür.
Bir kod parçası functional requirement'ı eksiksiz karşılayıp güvenlik açısından hatalı olabilir. “Kullanıcı belgeyi ID ile indirebiliyor” fonksiyonu çalışıyordur, testleri geçiyordur ve performansı iyidir. Fakat object'in o kullanıcıya ait olup olmadığı doğrulanmıyorsa security requirement karşılanmamıştır.
Otomatik SAST taraması nedir?
SAST, Static Application Security Testing ifadesinin kısaltmasıdır. Uygulama çalıştırılmadan source code, bytecode, intermediate representation veya bazı ürünlerde binary üzerinde otomatik analiz yapar.
SAST engine ürüne göre şu tekniklerin bir bölümünü kullanabilir:
- Pattern matching
- Abstract Syntax Tree analizi
- Semantic analysis
- Control Flow Analysis
- Data Flow Analysis
- Taint Analysis
- Call graph ve interprocedural analysis
- Type inference
- Framework ve library modelling
- Custom rule veya query çalıştırma
Araç riskli bir source ile hassas bir sink arasında güvenli olmayan data flow arayabilir. Örneğin HTTP request'ten gelen input'un SQL execution function'ına parameterization olmadan ulaştığını tespit edebilir. Ayrıca deprecated cryptographic API, hardcoded secret, certificate validation bypass veya unsafe deserialization option gibi pattern'leri işaretleyebilir.
SAST'ın neyi nasıl bulduğunu ayrıntılı incelemek için SAST nedir, hangi açıkları bulur, hangilerini kaçırır? başlıklı rehberimize bakabilirsiniz. Bu yazının odağı SAST'ın çalışma prensibini tekrarlamak değil, onun Secure Code Review ile nerede ayrıştığını göstermektir.
Manual review sırasında SAST kullanılırsa çalışma hâlâ manual mıdır?
Evet. Bir uzman SAST sonucunu review girdisi olarak kullanabilir. Tool'un işaretlediği flow'ları doğrulayabilir, false positive'leri ayıklayabilir ve aynı root cause'un başka örneklerini arayabilir.
Buradaki belirleyici fark şudur:
- SAST, finding üretmek için rule engine ve program modelini kullanır.
- Secure Code Review, güvenlik kararı vermek için insan muhakemesi ve application context'i kullanır.
İnsan reviewer'ın tool kullanması review'i otomatik hale getirmez. Benzer biçimde SAST çıktısına bir analistin severity vermesi de tek başına kapsamlı Secure Code Review yapıldığı anlamına gelmez.
Temel ayrım: Coverage ile context aynı şey değildir
SAST ve Secure Code Review arasındaki en önemli gerilim coverage ile context arasındadır.
Otomasyon aynı rule set'i bütün repository üzerinde tutarlı biçimde çalıştırabilir. Yorulmaz, dosya atlamaz ve her commit'te yeniden çalışabilir. Fakat uygulamanın neden var olduğunu, bir user role'ün hangi işleme izinli olması gerektiğini ve iki endpoint'in birlikte nasıl kötüye kullanılabileceğini kendiliğinden bilemez.
İnsan reviewer business context'i anlayabilir, beklenmeyen abuse case üretebilir ve code path'in arkasındaki security assumption'ı sorgulayabilir. Buna karşılık milyonlarca satırı her değişiklikte aynı yoğunlukta okuyamaz. Dikkat, süre ve uzmanlık sınırlıdır.
Bu farkı şu iki soruyla özetleyebiliriz:
SAST'ın sorusu:
Kısa cevap
“Bildiğim rule ve model'lere uyan riskli bir code pattern veya data flow var mı?”
Secure Code Review'in sorusu:
Kısa cevap
“Bu code path, uygulamanın security requirement'ını bütün beklenmeyen koşullarda gerçekten koruyor mu?”
Birinci soru ölçeklenebilir ve tekrar edilebilirdir. İkinci soru context gerektirir.
Secure Code Review ve SAST karşılaştırması
| Karşılaştırma noktası | Secure Code Review | Otomatik SAST taraması |
|---|---|---|
| Ana amaç | Kodun security requirement ve threat scenario'lara göre doğru davranıp davranmadığını değerlendirmek | Rule ile tanımlanabilen unsafe pattern ve data flow'ları otomatik bulmak |
| Kararı veren | Security reviewer | Analysis engine, rule set ve program model |
| Temel girdi | Source code, architecture, requirement, role, data flow ve business context | Source code, build artifact, language ve tool configuration |
| Güçlü taraf | Context, niyet, root cause ve uygulamaya özgü risk | Hız, tutarlılık, tekrar edilebilirlik ve geniş pattern coverage |
| Zayıf taraf | Zaman ve uzmanlık sınırlı, reviewer coverage'ı risk bazlı | Context eksikliği, false positive ve rule dışında kalan false negative |
| Business logic | Güçlü | Genellikle zayıf |
| Authorization | Custom ve context-dependent kontrol için güçlü | Framework model ve explicit pattern kadar güçlü |
| Injection | Data flow manuel izlenebilir, fakat geniş taramada zaman alır | Source ve sink doğru modellenmişse güçlü |
| Cryptography | Protocol, key lifecycle ve kullanım amacı değerlendirilebilir | Known unsafe API ve configuration pattern'lerinde güçlü |
| Race condition | State ve concurrency mantığı anlaşılabiliyorsa güçlü | Tool capability ve language model'e göre sınırlı |
| Malicious code | Niyet ve beklenmeyen işlev araştırılabilir | Known pattern yoksa zorlanır |
| Büyük repository | Risk bazlı sampling ve focus gerekir | Desteklenen kodun geniş bölümünü tarayabilir |
| Her commit'te çalışma | Yüksek efor nedeniyle seçici uygulanır | CI/CD içinde sürekli çalıştırılabilir |
| Evidence | Requirement, code path, precondition, root cause ve abuse scenario | Rule ID, file, line, source, sink ve trace |
| Sonuç türü | Bağlama göre doğrulanmış weakness ve design gap | Potential finding, security hotspot veya yüksek confidence data flow |
| Remediation | Sistemik design ve implementation değişikliği önerebilir | Genellikle finding'e yakın code-level fix önerir |
Tablo iki yöntemin rakip değil, farklı evidence üreten kontroller olduğunu gösterir. SAST broad signal üretir. Secure Code Review bu sinyalin anlamını ve araçların göremediği security assumption'ları inceler.
Secure Code Review nasıl yürütülür?
Kaliteli manual review, reviewer'ın repository açıp rastgele dosya okuması değildir. İnceleme risk modeline ve izlenebilir bir yönteme dayanmalıdır.
1. Security context oluşturulur
Reviewer önce uygulamanın ne yaptığını öğrenir. Aşağıdaki bilgiler olmadan code line'ların güvenlik anlamı eksik kalır:
- Architecture diagram
- Component ve service inventory
- User role ve permission matrix
- Tenant modeli
- Data classification
- Authentication flow
- External integration ve trust boundary'ler
- Kritik business workflow'lar
- Security requirement'lar
- Threat model ve abuse case'ler
- Deployment modeli
- Önceki pentest ve incident bulguları
Bir payment approval function'ının güvenli olup olmadığı, kimlerin hangi tutara kadar onay verebildiği bilinmeden değerlendirilemez. Reviewer kodu görür, fakat beklenen business rule'ü bilmezse implementation'ın yanlış olduğunu söyleyemez.
2. Attack surface kod üzerinden haritalanır
Route, controller, resolver, handler, consumer, scheduled job, CLI command, webhook ve administrative interface'ler belirlenir. Yalnızca public HTTP endpoint'leri değil, application'a veri sokan bütün giriş yolları dikkate alınır.
Örneğin bir order kaydı şu kaynaklardan değiştirilebilir:
- REST API
- GraphQL mutation
- Admin panel
- Message queue consumer
- Batch import
- Webhook
- Support tool
- Database migration script
Authorization yalnızca REST controller'da uygulanıyorsa diğer entry point'ler aynı security control'ü bypass edebilir.
3. Security control'ler ve trust boundary'ler izlenir
Reviewer authentication, authorization, validation, encoding, cryptography, logging ve secret access gibi kontrollerin nerede uygulandığını belirler.
Sorulan sorular şunlardır:
- Kontrol merkezi mi, dağınık mı?
- Bütün entry point'ler aynı control path'i kullanıyor mu?
- User-controlled value trusted context'e dönüşürken ne oluyor?
- Tenant ID request'ten mi, authenticated session'dan mı geliyor?
- Service-to-service çağrıda user context korunuyor mu?
- Background job aynı policy'yi yeniden uyguluyor mu?
- Error ve timeout sırasında default karar nedir?
- Cache key security boundary'yi koruyor mu?
- Legacy API version aynı kontrolü içeriyor mu?
4. Positive ve negative flow birlikte incelenir
Functional test çoğunlukla doğru input ile beklenen sonuca odaklanır. Secure Code Review negative ve adversarial state'leri de arar:
- Input eksikse
- Birden fazla field birbiriyle çelişiyorsa
- Request sırası değiştiriliyorsa
- Onay sonrası data değiştiriliyorsa
- Dependency timeout oluyorsa
- Token expire sınırındaysa
- Aynı işlem eşzamanlı çağrılıyorsa
- User role işlem ortasında değişiyorsa
- Object başka tenant'a taşınıyorsa
- Retry aynı işlemi ikinci kez çalıştırıyorsa
Bir security control normal akışta çalışıp exception path'te atlanabilir.
5. Finding tek satırda bırakılmaz
Reviewer vulnerable line'ı bulduktan sonra call site'ları, sibling function'ları ve aynı helper'ı kullanan module'leri araştırır. Amaç yalnızca bir bug raporlamak değil, root cause ve yayılımı belirlemektir.
Örneğin findById(id) method'u tenant filter uygulamıyorsa şu sorular sorulur:
- Method kaç yerde çağrılıyor?
- Read, update ve delete işlemleri aynı repository'yi kullanıyor mu?
- Admin bypass yanlışlıkla standard user'a ulaşıyor mu?
- Aynı anti-pattern başka entity'lerde tekrar ediyor mu?
- Güvenli repository abstraction tasarlanabilir mi?
- Regression test bütün object-level authorization kuralını kapsayabilir mi?
Bu sistemik yaklaşım, tek endpoint fix'inin ardından aynı vulnerability'nin başka yerde kalmasını engeller.
Otomatik SAST taraması nasıl yürütülür?
SAST'ın “tool kuruldu, repository tarandı” şeklinde ele alınması sonuç kalitesini düşürür. Doğru bir SAST programında tool capability kadar configuration ve operasyon modeli önemlidir.
1. Language ve build coverage doğrulanır
Araç repository'deki bütün language'leri gerçekten destekliyor mu? Generated code, template, Infrastructure as Code, serverless function ve frontend bundle analiz ediliyor mu? Build gerektiren mode çalışıyor mu?
Bir scan job'ın exit code 0 dönmesi, bütün codebase'in analiz edildiği anlamına gelmeyebilir. Parser error, unresolved dependency, skipped module ve timeout bilgileri ayrıca kontrol edilmelidir.
2. Rule set ve framework model seçilir
Default rule set her uygulama için yeterli değildir. Programming language, framework, data access layer ve kurumsal secure coding standard'a uygun configuration gerekir.
Örneğin custom HTTP wrapper input source olarak tanınmıyorsa taint flow başlamaz. Kuruma özgü query helper sink olarak modellenmediyse SQL injection kaçabilir. Güvenli sanitizer araca tanıtılmamışsa aynı flow false positive üretebilir.
3. Baseline oluşturulur
Legacy repository ilk taramada binlerce finding üretebilir. Hepsini bir gecede pipeline gate yapmak development'ı durdurur ve ekiplerin tool'u devre dışı bırakmasına yol açar.
Sağlıklı modelde mevcut finding'ler triage edilir, riskli olanlar remediation planına alınır ve yeni code change'lerin yeni High veya Critical finding üretmesi engellenir. Baseline, geçmiş borcu görünmez yapmak için değil yeni borcun büyümesini durdurmak için kullanılır.
4. Finding'ler insan tarafından doğrulanır
OWASP ve NIST kaynakları da otomatik static analysis sonucunun insan review'iyle ele alınmasını vurgular. Tool'un verdiği source, sink, trace ve confidence bilgisi application context ile karşılaştırılır.
Triage sırasında şu sorular sorulur:
- Input gerçekten attacker-controlled mı?
- Code path reachable mı?
- Sanitizer doğru context için etkili mi?
- Başka bir control exploitation'ı engelliyor mu?
- Finding production code içinde mi?
- Test fixture veya sample credential mı?
- Runtime configuration riski aktive ediyor mu?
- Aynı root cause başka yerde var mı?
5. Sonuç development workflow'una girer
Finding PDF içinde kalmamalıdır. Repository, commit, owner, SLA, severity, suppression gerekçesi ve verification kaydı issue tracking sisteminde izlenmelidir.
“SAST bütün kodu tarar” cümlesi ne kadar doğru?
Bu ifade teknik olarak şartlıdır. Tool dosyaların tamamını görmüş olabilir, fakat hepsini aynı derinlikte analiz etmiş olmayabilir.
SAST coverage'ını etkileyen unsurlar şunlardır:
- Desteklenmeyen programming language
- Parser error
- Eksik dependency
- Build'in tamamlanmaması
- Generated source'un oluşmaması
- Dynamic language feature'ları
- Reflection ve runtime binding
- Framework magic
- Cross-service data flow
- Database veya message queue sınırı
- Native code ve managed code geçişi
- Analysis timeout
- Monorepo içinde yanlış root seçimi
- Exclude pattern'leri
- Rule'ın kapalı olması
- Source veya sink model'inin eksikliği
- Incremental scan'in yanlış baseline ile karşılaştırılması
Bu nedenle SAST raporunda finding sayısından önce scan health değerlendirilmelidir.
Sağlıklı bir scan özeti şunları göstermelidir:
- Taranması beklenen ve gerçekten taranan repository/module
- Analiz edilen language ve file sayısı
- Parse veya compile error'ları
- Skipped file ve exclusion'lar
- Çalışan rule pack'ler
- Timeout ve resource limit'leri
- Full scan veya incremental scan bilgisi
- Commit hash
- Tool ve rule version'ı
Yüzde 100 dosya erişimi, yüzde 100 vulnerability detection anlamına gelmez. SAST coverage bir test coverage yüzdesi gibi yorumlanmamalıdır.
“Manual reviewer bütün kodu okur” cümlesi ne kadar doğru?
Bu ifade de çoğu büyük proje için gerçekçi değildir. Milyonlarca satırlık codebase'in her satırını aynı dikkatle okumak hem ekonomik hem bilişsel açıdan mümkün olmayabilir.
Secure Code Review coverage'ı şu ölçütlerle tanımlanmalıdır:
- Kritik component'ler
- Trust boundary'ler
- Sensitive data flow'lar
- Authentication ve authorization control'leri
- High-risk function ve module'ler
- Public ve privileged entry point'ler
- Security-sensitive change'ler
- Threat model'deki yüksek riskli scenario'lar
- SAST ve pentest bulgularının işaret ettiği alanlar
- Representative implementation pattern'leri
Review “kaç satır okundu?” yerine “hangi güvenlik iddiası hangi code path üzerinden doğrulandı?” sorusuyla ölçülmelidir.
Örneğin 700 bin satırlık bir uygulamada bütün generated DTO'ları okumak yerine tenant isolation'ın controller, service, repository, cache ve background job boyunca nasıl korunduğunu incelemek daha değerlidir.
Aynı vulnerability sınıfında iki yöntem nasıl ayrışır?
Farkı en net biçimde teknik senaryolar gösterir.
Senaryo 1: Multi-tenant IDOR
Bir endpoint invoice ID alıyor ve kaydı döndürüyor.
SAST ne görür?
Tool, framework için özel authorization annotation eksikliğini rule olarak biliyorsa finding üretebilir. Ancak authorization service layer'da custom bir helper ile uygulanıyorsa veya requirement “kullanıcı yalnızca kendi tenant'ındaki invoice'u görebilir” şeklindeyse tool bunu çoğu zaman bilemez.
Secure Code Review ne görür?
Reviewer tenant ID'nin request parameter'dan mı, authenticated context'ten mi geldiğini inceler. Repository query'nin invoiceId yanında tenantId ile sınırlandırılıp sınırlandırılmadığını kontrol eder. Admin bypass, export endpoint, attachment download ve background job gibi alternatif path'leri araştırır.
Ayrım nerede oluşur?
SAST explicit missing check pattern'i arar. Reviewer ise hangi check'in business açısından gerekli olduğunu bilir.
Senaryo 2: SQL injection ve custom query wrapper
Uygulama kurum içinde geliştirilmiş bir database wrapper kullanıyor.
SAST ne görür?
Wrapper'ın execute method'u sink olarak tanımlanmışsa user input'tan query'ye kadar yüzlerce flow taranabilir. Tanımlanmamışsa ciddi SQL injection'lar görünmeyebilir. Güvenli parameterization method'u sanitizer olarak yanlış modellenirse false negative oluşabilir.
Secure Code Review ne görür?
Reviewer wrapper implementation'ını ve çağrı contract'ını inceler. Query fragment'ın hangi argument ile birleştirildiğini, parameter list'in gerçekten binding yapıp yapmadığını ve identifier allowlist'inin doğru uygulanıp uygulanmadığını kontrol eder.
Ayrım nerede oluşur?
SAST doğru model olduğunda geniş coverage sağlar. Reviewer modelin doğru olup olmadığını ve custom abstraction'ın güvenlik garantisini anlar.
Senaryo 3: SSRF allowlist bypass
Uygulama kullanıcıdan URL alıyor ve yalnızca izinli partner domain'lerine request göndermesi gerekiyor.
SAST ne görür?
User input'un HTTP client sink'ine ulaştığını bulabilir. Arada validatePartnerUrl() çağrısı varsa tool bunu sanitizer kabul edebilir veya tanımadığı için false positive üretebilir.
Secure Code Review ne görür?
Reviewer validation'ın string prefix ile mi, parse edilmiş hostname ile mi yapıldığını kontrol eder. Redirect sonrası destination'ın yeniden doğrulanıp doğrulanmadığını, DNS resolution ile private IP kontrolünün sırasını, userinfo, mixed encoding ve port davranışını inceler.
Ayrım nerede oluşur?
SAST “validation function çağrıldı” bilgisini görür. Reviewer validation'ın security requirement'ı gerçekten karşılayıp karşılamadığını değerlendirir.
Senaryo 4: Coupon kullanımında race condition
İş akışı coupon'ın kullanılmadığını kontrol ediyor, discount uyguluyor ve ardından coupon'ı kullanılmış olarak işaretliyor.
SAST ne görür?
Bazı gelişmiş analyzer'lar shared state ve concurrency problemine ilişkin sinyal üretebilir. Fakat database transaction isolation, distributed service ve business invariant kombinasyonu çoğu genel SAST rule'unun kapsamı dışındadır.
Secure Code Review ne görür?
Reviewer “coupon yalnızca bir kez kullanılabilir” invariant'ını bilir. Check ve update'in aynı atomic transaction içinde olmadığını, unique constraint bulunmadığını ve iki parallel request'in aynı state'i okuyabildiğini görür.
Ayrım nerede oluşur?
Tool genel code pattern'i analiz eder. İnsan, concurrency akışının finansal anlamını ve doğru atomicity sınırını yorumlar.
Senaryo 5: Webhook signature fail-open
Payment provider'dan gelen webhook, signature verification service'i timeout olduğunda işlenmeye devam ediyor.
SAST ne görür?
Riskli catch veya empty exception block rule'u finding üretebilir. Ancak timeout sonrası business operation'ın neden güvenli olmadığını ve fake payment confirmation'a dönüşebileceğini bilmez.
Secure Code Review ne görür?
Reviewer verification başarısız olduğunda default kararın reject olması gerektiğini belirler. Retry, duplicate event, idempotency ve order state transition'larını birlikte inceler.
Ayrım nerede oluşur?
SAST exception handling smell'i bulabilir. Reviewer bunun authentication boundary ve payment integrity üzerindeki etkisini kanıtlar.
Senaryo 6: Cryptographic API doğru, protocol yanlış
Uygulama modern bir encryption algorithm kullanıyor, fakat aynı nonce birden fazla message için tekrar ediliyor.
SAST ne görür?
Known unsafe algorithm kullanılmadığı için finding üretmeyebilir. Rule nonce'ın constant olduğunu görürse sinyal çıkarabilir, fakat nonce'ın distributed node'lar arasında tekrarlandığı durum runtime ve architecture context'i gerektirebilir.
Secure Code Review ne görür?
Reviewer nonce üretim kaynağını, uniqueness garantisini, node restart davranışını, key scope'unu ve storage modelini birlikte değerlendirir.
Ayrım nerede oluşur?
SAST API kullanımını doğrular. Reviewer cryptographic protocol'ün güvenlik özelliğini doğrular.
Senaryo 7: Mass assignment
Request body doğrudan domain model'e bind ediliyor. Model içinde role, isApproved veya creditLimit gibi user-controlled olmaması gereken field'lar bulunuyor.
SAST ne görür?
Framework için mass assignment rule'u varsa geniş bir candidate listesi çıkarabilir. Ancak hangi field'ın kullanıcı tarafından değiştirilebilir olması gerektiğini bilmediği için false positive üretebilir veya custom binder'ı kaçırabilir.
Secure Code Review ne görür?
Reviewer writable field'ları business role ve workflow'a göre değerlendirir. Approval state'in yalnızca başka bir service tarafından değiştirilebilmesi gerektiğini anlar ve explicit request DTO kullanımını önerir.
Ayrım nerede oluşur?
SAST technical binding pattern'ini görür. Reviewer field-level authorization requirement'ını bilir.
Senaryo 8: Second-order data flow
Kullanıcıdan alınan bir değer database'e kaydediliyor. Günler sonra başka bir service bu değeri spreadsheet export içinde formula olarak işliyor.
SAST ne görür?
Source ve sink farklı service, repository veya scan unit içindeyse data flow kopabilir. İki module aynı codebase içinde olsa bile persistence boundary ilişkiyi zorlaştırır.
Secure Code Review ne görür?
Reviewer data lineage'ı ve output context'i izler. İlk girişte zararsız görünen değerin export sırasında formula injection'a dönüştüğünü belirler.
Ayrım nerede oluşur?
SAST analiz sınırları içinde flow arar. İnsan farklı zaman ve component'lerdeki işleme adımlarını business workflow üzerinden birleştirir.
Senaryo 9: Gizli administrative bypass
Belirli bir header ve sabit değer geldiğinde support kullanıcısına geçici admin yetkisi veren unutulmuş test kodu bulunuyor.
SAST ne görür?
Hardcoded secret veya suspicious comparison rule'u finding üretebilir. Fakat değer obfuscate edilmişse, birkaç function'a bölünmüşse veya davranış custom ise tool bunu sıradan code olarak görebilir.
Secure Code Review ne görür?
Reviewer authorization modelinde dokümante edilmemiş branch'i fark eder. Bu branch'in neden var olduğunu, hangi route'larda çalıştığını ve audit log üretip üretmediğini araştırır.
Ayrım nerede oluşur?
SAST bilinen suspicious pattern'i arar. İnsan kodun beklenen ürün davranışıyla uyuşmayan niyetini sorgular.
Senaryo 10: Hassas verinin log'a yazılması
Application error durumunda request object'in tamamını logluyor.
SAST ne görür?
Sensitive field isimleri veya taint flow biliniyorsa password, token ya da personal data'nın log sink'ine ulaştığını bulabilir. Custom object serialization tool tarafından modellenmiyorsa kaçırabilir.
Secure Code Review ne görür?
Reviewer hangi field'ların data classification açısından hassas olduğunu, masking'in hangi katmanda yapıldığını ve exception sırasında normal logging policy'nin bypass edilip edilmediğini değerlendirir.
Ayrım nerede oluşur?
SAST veri akışını, reviewer ise verinin kurumsal ve hukuki anlamını yorumlar.
SAST hangi alanlarda Secure Code Review'den daha avantajlıdır?
Manual review'in daha derin olması her alanda daha verimli olduğu anlamına gelmez.
Tekrarlanan unsafe pattern'ler
Deprecated API, unsafe random function, certificate validation bypass, command execution ve weak cryptographic primitive gibi açık biçimde rule'a dönüştürülebilen pattern'ler otomasyon için uygundur.
Tool aynı pattern'i bütün repository boyunca tutarlı biçimde arar. İnsan reviewer bir örneği bulduktan sonra diğer kullanımları manual search ile bulabilir, fakat SAST bu işi sürekli ve daha hızlı yapar.
Büyük codebase ve monorepo
Yüzlerce service ve milyonlarca satır içeren repository'de broad visibility için SAST gereklidir. Her module'e aynı manual review eforunu ayırmak mümkün değildir.
SAST burada final karar değil, risk haritası sağlar. Hotspot, data flow ve yeni code change'ler reviewer önceliklendirmesine girdi olur.
Her commit'te tekrar
Secure Code Review yüksek riskli change'lerde ve belirli checkpoint'lerde yapılabilir. SAST ise pull request, merge, nightly build ve release pipeline içinde otomatik çalıştırılabilir.
Bu tekrar edilebilirlik regression yakalamak için değerlidir. Daha önce kaldırılan unsafe function yeni bir branch'te yeniden kullanılırsa rule aynı gün finding üretebilir.
Standard enforcement
Kuruma özgü secure coding standard makine tarafından kontrol edilebilir kurallara dönüştürüldüğünde SAST policy enforcement sağlar.
Örnekler:
- Raw SQL kullanımını yasaklamak
- Belirli cryptographic API'leri engellemek
- Direct file access yerine approved wrapper zorunluluğu
- Certificate verification disable option'ını yasaklamak
- Sensitive class'ların generic logger'a verilmesini engellemek
- Internal authorization helper dışında privilege change yapılmasını engellemek
Human reviewer policy'nin tasarımını ve istisnalarını yönetir. SAST tekrarlanan enforcement işini üstlenir.
Differential feedback
SAST yalnızca yeni veya değişen satırların ürettiği finding'leri gösterebilir. Developer pull request aşamasında hızlı feedback alır. Sorun henüz context tazeyken düzeltilir.
Bu model, bütün legacy finding'leri her pull request'te tekrar gösterip signal-to-noise oranını düşürmekten daha etkilidir.
Secure Code Review hangi alanlarda SAST'tan daha avantajlıdır?
Business logic ve state transition
Tool, bir işlemin teknik olarak nasıl yapıldığını görür. İnsan, o işlemin hangi sırada ve kim tarafından yapılması gerektiğini anlayabilir.
Discount, payment, approval, refund, invite, subscription ve entitlement akışları bu nedenle manual review gerektirir.
Custom authentication ve authorization
Framework annotation kullanan standart kontrol SAST tarafından modellenebilir. Kuruma özgü policy engine, tenant rule, delegated access ve object ownership mantığı insan context'i gerektirir.
MITRE CWE kayıtları da custom authorization ve authentication mekanizmalarında manual static analysis'in önemine işaret eder.
Security requirement doğrulaması
SAST finding odaklıdır. Secure Code Review requirement odaklı olabilir.
Örneğin requirement şudur:
Kısa cevap
“Support kullanıcısı customer card data'nın yalnızca maskelenmiş halini görebilir.”
Reviewer bu requirement'ı API response, admin UI, export, log, cache ve background notification path'leri boyunca doğrular. Tool'un bunu anlaması için hassas data type, role ve allowed representation model'lerinin özel olarak tanımlanması gerekir.
Design ve trust boundary hataları
Security control yanlış component'e yerleştirilmiş olabilir. Internal service request'i otomatik trusted kabul edebilir. Queue consumer message authentication yapmayabilir. Cache tenant boundary'yi taşımayabilir.
Bu problemler tek bir unsafe line değil, yanlış security assumption'dır.
Fail-open ve exceptional state
Dependency failure, timeout, parser error veya policy service kesintisi sırasında ne olduğu manual review ile daha anlamlı değerlendirilir.
SAST empty catch block bulabilir. Fakat bunun inventory sayfasında minor, payment authorization akışında critical olabileceğini business context belirler.
Root cause ve systemic remediation
Tool finding'e yakın fix önerebilir. İnsan reviewer sorunun neden tekrarlandığını ve hangi abstraction'ın değiştirilmesi gerektiğini belirleyebilir.
Örneğin 40 endpoint'te authorization eksikse çözüm 40 ayrı if eklemek olmayabilir. Tenant-scoped repository, centralized policy enforcement veya safe-by-default framework extension daha kalıcı çözüm olabilir.
False positive farkı nasıl yönetilmeli?
SAST'ın false positive üretmesi tool'un işe yaramadığı anlamına gelmez. Static analysis belirsizlik altında çalışır. Runtime value, external component ve custom sanitizer hakkında yeterli bilgi olmadığında güvenli tarafta kalıp finding üretebilir.
Yaygın false positive nedenleri şunlardır:
- Tool'un trusted source'u untrusted sayması
- Güvenli sanitizer'ı tanımaması
- Framework auto-escaping davranışını bilmemesi
- Infeasible code path'i reachable kabul etmesi
- Test veya sample code'u production sanması
- Compensating control'ü görmemesi
- Type veya alias çözümlemesinin eksik olması
- Cross-module flow'u yanlış kurması
- Generated code'u gerçek source gibi değerlendirmesi
False positive yönetiminin yanlış biçimi finding'i “not exploitable” etiketiyle gerekçesiz kapatmaktır.
Doğru triage kaydı şunları içermelidir:
- Finding neden false positive?
- Hangi code evidence bunu gösteriyor?
- Hangi sanitizer veya control etkili?
- Control değişirse suppression geçersiz olur mu?
- Suppression yalnızca bu instance'a mı, rule geneline mi uygulanıyor?
- Kararı kim ve ne zaman verdi?
- Sonraki tool veya framework version'ında yeniden kontrol edilecek mi?
Secure Code Review finding'leri de yanlış olabilir. Reviewer security requirement'ı yanlış anlamış, framework'ün korumasını gözden kaçırmış veya unreachable path'i riskli kabul etmiş olabilir. Human analysis otomatik olarak doğru değildir. Peer validation ve developer walkthrough önemlidir.
False negative farkı nasıl yönetilmeli?
False negative, gerçek vulnerability'nin yöntem tarafından bulunmamasıdır. Güvenlik açısından false positive'den daha sessiz ve daha tehlikelidir.
SAST false negative nedenleri
- Vulnerability için rule yoktur
- Custom source veya sink modellenmemiştir
- Language veya framework tam desteklenmiyordur
- Data flow service veya storage sınırında kopmuştur
- Analysis depth yetersizdir
- Sanitizer yanlış biçimde trusted kabul edilmiştir
- File scan dışında kalmıştır
- Build başarısızdır
- Dynamic dispatch çözülememiştir
- Business context gereklidir
Secure Code Review false negative nedenleri
- Riskli component scope dışında kalmıştır
- Reviewer ilgili framework'e yeterince hâkim değildir
- Threat model eksiktir
- Business requirement paylaşılmamıştır
- Süre nedeniyle code path incelenmemiştir
- Çok büyük diff dikkat dağılmasına yol açmıştır
- SAST'ın bulabileceği tekrarlanan pattern manual olarak kaçmıştır
- Review checklist yanlış güven alanlarına odaklanmıştır
- Developer açıklaması sorgulanmadan kabul edilmiştir
Bu nedenle hiçbir yöntem için “bulgu yoksa açık yoktur” denemez. Assurance, farklı verification yöntemlerinin sonuçlarını birleştirerek artırılır.
SAST bulgusu ile Secure Code Review bulgusu nasıl raporlanmalı?
İki rapor aynı template'e zorlanmamalıdır.
İyi bir SAST finding kaydı
- Repository ve commit hash
- Tool ve rule version'ı
- Rule ID ve CWE
- File ve line
- Source ve sink
- Data flow trace
- Confidence
- Reachability değerlendirmesi
- Framework ve sanitizer context'i
- Triage kararı
- Suppression gerekçesi
- Suggested code-level remediation
- Verification scan sonucu
İyi bir Secure Code Review bulgusu
- İhlal edilen security requirement
- Etkilenen business workflow
- Trust boundary
- Entry point ve code path
- Precondition ve user role
- Root cause
- Vulnerable implementation
- Abuse scenario
- Aynı pattern'in diğer örnekleri
- Technical ve business impact
- Systemic remediation
- Negative security test önerisi
- Fix review ve retest yöntemi
Örnek birleşik bulgu kaydı
| Alan | Örnek |
|---|---|
| SAST sinyali | DocumentRepository.findById() dönüşü authorization check olmadan controller'a ulaşıyor |
| Manual context | Standard user yalnızca kendi tenant'ındaki document'ları görebilmeli |
| Root cause | Tenant context repository contract'ında zorunlu değil |
| Yayılım | Aynı repository method'u download, preview, export ve delete path'lerinde kullanılıyor |
| Exploit koşulu | Authenticated account ve başka tenant'a ait document UUID |
| Business impact | Cross-tenant sensitive document disclosure ve deletion |
| Systemic fix | Tenant-scoped repository interface ve centralized policy check |
| Regression test | İki tenant ile read, update, delete ve export negative testleri |
| SAST iyileştirmesi | Unsafe unscoped repository method'u için custom rule |
Bu modelde SAST finding'i reviewer'a sinyal verir. Reviewer root cause'u anlar. Bulunan systemic pattern daha sonra custom SAST rule'a çevrilir. İnsan bilgisi otomasyona geri kazandırılır.
En güçlü model: İnsan bulur, otomasyon kalıcılaştırır
Secure Code Review ile SAST'ın birlikte kullanımındaki en yüksek değer, iki yönlü feedback loop'tan gelir.
SAST reviewer'ı yönlendirir
- Riskli data flow'ları gösterir
- High-risk API kullanımlarını listeler
- Büyük codebase içinde hotspot çıkarır
- Tekrarlanan pattern'i bulur
- Yeni diff içindeki regression'ı işaretler
Reviewer SAST'ı geliştirir
- Custom source ve sink tanımlar
- Güvenli sanitizer model'ini doğrular
- Kuruma özgü anti-pattern'i custom rule'a çevirir
- False positive suppression politikasını iyileştirir
- Tool'un kaçırdığı framework davranışını modeller
- Severity'yi business context ile yeniden belirler
Örneğin reviewer bir payment method'unda “user-provided amount server-side yeniden hesaplanmıyor” hatasını buldu. Bu business logic finding'inin tamamı genel SAST ile otomatikleşmeyebilir. Ancak riskli helper'ın doğrudan çağrılması, trusted pricing service yerine request amount kullanılması veya belirli validation function'ının eksikliği kuruma özgü rule'a dönüştürülebilir.
Her manual bulgu otomasyona uygun değildir. Yine de tekrar edebilir code property'ler rule, unit test, integration test veya policy-as-code haline getirilebilir.
Secure Code Review ne zaman zorunlu hale gelir?
Her küçük change için kapsamlı third-party review gerçekçi değildir. Risk bazlı trigger'lar tanımlanmalıdır.
Manual security review özellikle şu değişikliklerde güçlü biçimde gereklidir:
- Authentication veya session management değişikliği
- Authorization, role veya permission modeli değişikliği
- Multi-tenant isolation
- Payment, refund, balance ve financial transaction
- Cryptographic implementation veya key management
- File upload, archive extraction ve document processing
- Deserialization ve dynamic code execution
- Webhook ve service-to-service authentication
- Sensitive data storage, export ve logging
- Administrative ve support function
- Password reset, account recovery ve MFA flow
- New external integration
- Custom protocol veya security control
- Concurrency ve distributed transaction
- CI/CD, deployment ve secret management code'u
- Önceki incident ile ilişkili component
- SAST'ın desteklemediği language veya framework
Bu alanlarda “SAST clean” sonucu manual review ihtiyacını kaldırmaz.
SAST ne zaman mutlaka çalıştırılmalı?
SAST ise seçili checkpoint'lerle sınırlanmamalıdır. Uygun tool ve pipeline yapısı varsa şu aşamalarda çalışabilir:
- Developer IDE veya local pre-commit aşaması
- Pull request
- Merge öncesi quality gate
- Main branch full scan
- Nightly veya scheduled deep scan
- Release candidate
- Rule pack veya tool version güncellemesi
- Yeni vulnerability pattern'i öğrenildiğinde repo-wide tarama
- Incident sonrası benzer code pattern araması
- Remediation verification
Hızlı rule set developer feedback için, daha derin interprocedural analysis ise nightly veya release pipeline için ayrılabilir.
Baseline Review ve Diff-Based Review farkı
Secure Code Review tek formatta yapılmaz.
Baseline Review
Application veya kritik component'in mevcut durumunu kapsamlı biçimde inceler. Şu durumlarda uygundur:
- Yeni ürün ilk kez değerlendiriliyorsa
- Legacy application AppSec programına alınıyorsa
- Büyük architecture değişikliği yapıldıysa
- Acquisition sonrası codebase devralındıysa
- Incident sonrası root cause ve yayılım araştırılıyorsa
- Kritik compliance veya customer assurance ihtiyacı varsa
Baseline Review riskli module, control ve data flow'ların haritasını çıkarır. Her satırın aynı yoğunlukta okunması anlamına gelmez.
Diff-Based Review
Pull request, commit veya release arasındaki değişikliklere odaklanır. Günlük development'a daha iyi entegre olur.
Ancak diff tek başına context değildir. Beş satırlık değişiklik eski bir unsafe helper'ı reachable hale getirebilir. Reviewer değişen satırların caller ve callee ilişkisini, permission modelini ve ilgili testleri de incelemelidir.
Hybrid model
Önce baseline ile kritik architecture ve security control'ler anlaşılır. Sonra high-risk diff'ler sürekli review edilir. SAST bütün change'lerde çalışır ve yeni sinyalleri reviewer'a taşır.
Bu model hem context'i korur hem ölçeklenebilirlik sağlar.
CI/CD içinde iki yöntem nasıl konumlandırılmalı?
İyi tasarlanmış pipeline her finding'i aynı gate'e bağlamaz.
Developer feedback katmanı
Hızlı SAST rule'ları IDE veya pull request üzerinde çalışır. Yüksek confidence yeni finding doğrudan developer'a gösterilir. Feedback süresi kısa tutulur.
Merge gate katmanı
Yeni Critical ve High finding, hardcoded active secret, unsafe cryptographic disable veya banned API gibi net policy ihlalleri merge'i durdurabilir.
Gate uygulanırken şu bilgiler bulunmalıdır:
- Finding yeni mi?
- Confidence yeterli mi?
- Rule ekip için tune edildi mi?
- Owner ve exception workflow'u belli mi?
- Tool başarısızsa fail-open mı, fail-closed mu davranacak?
SAST job teknik olarak çalışmazken pipeline'ın “temiz” kabul edilmesi ciddi bir süreç hatasıdır.
Manual review gate katmanı
Repository label, changed path, data classification veya threat model'e göre high-risk change'ler security reviewer onayına gider.
Örnek trigger'lar:
/auth/,/payments/,/crypto/,/admin/path'leri- Permission schema değişikliği
- New public endpoint
- Sensitive data model değişikliği
- Infrastructure veya IAM policy değişikliği
- SAST'ta belirli high-risk rule
- Büyük dependency veya framework migration
Nightly ve release assurance katmanı
Full SAST, deeper analysis, SCA, secret scanning ve gerekirse DAST birlikte çalışır. Kritik release öncesinde odaklı Secure Code Review ve sızma testi eklenir.
Kaynak kod analizi ile runtime doğrulamanın neden farklı olduğunu Kaynak kod analizi ile sızma testi aynı problemi çözmez: nerede ayrışır? yazımızda ayrıntılı ele aldık.
Pipeline gate nasıl seçilmeli?
Her SAST finding merge'i durdurursa ekip kısa sürede alert fatigue yaşar. Hiçbir finding gate değilse SAST yalnızca dashboard üretir.
Gate kararı şu unsurlara dayanmalıdır:
- Rule precision geçmişi
- Finding confidence
- Vulnerability class
- Değişikliğin risk seviyesi
- Asset criticality
- Reachability
- New code veya legacy code olması
- Active secret gibi acil durum
- Compensating control
- Exception expiry tarihi
Örnek gate politikası:
| Finding türü | Pull request davranışı |
|---|---|
| Active hardcoded secret | Merge durur, secret rotate edilir |
| High-confidence command injection | Merge durur, manual validation gerekir |
| Deprecated weak hash | Kullanım amacına göre gate veya review |
| Unreachable test code finding | Gerekçeli suppression |
| Low-confidence generic XSS | Security review queue |
| Legacy baseline finding | SLA ile backlog, yeni code'a yayılması engellenir |
| SAST engine failure | Sonucun temiz sayılması engellenir |
SAST aracı seçerken Secure Code Review ekibi neden sürece katılmalı?
Tool seçimi yalnızca procurement ve DevOps kararı olmamalıdır. Uygulamanın language, framework ve vulnerability profile'ını bilen reviewer'lar pilot sürece katılmalıdır.
Değerlendirme kriterleri şunlardır:
- Kullanılan language ve framework için gerçek analiz derinliği
- Build-required ve buildless mode farkı
- Interprocedural ve cross-file data flow
- Custom source, sink ve sanitizer tanımı
- Custom rule/query desteği
- Incremental scan ve full scan davranışı
- Monorepo desteği
- IDE, repository ve issue tracker entegrasyonu
- Scan health ve coverage görünürlüğü
- False positive suppression yönetimi
- Audit trail
- On-premise veya air-gapped çalışma seçeneği
- Source code retention ve data residency
- Rule update sıklığı
- API ve automation capability
- License model ve gerçek pipeline maliyeti
Vendor'ın demo repository'sindeki başarı, kurumun custom framework'ünde aynı sonucu garanti etmez. NIST SATE çalışmaları da static analysis aracının kurumun kendi codebase'i ve use case'i üzerinde değerlendirilmesinin önemine işaret eder.
Pilot sırasında seeded test case, geçmiş gerçek finding ve bilinen safe pattern'ler kullanılabilir. Amaç yalnızca daha çok finding üreten tool'u seçmek değil, yararlı signal-to-noise oranını ölçmektir.
Secure Code Review hizmeti alırken ne sorulmalı?
“Manual review dahildir” ifadesi tek başına yeterli değildir.
Teklifte şu soruların cevabı bulunmalıdır:
- Baseline mi, diff-based mi review yapılacak?
- Hangi repository, branch ve commit incelenecek?
- Hangi component ve data flow öncelikli?
- Architecture ve threat model review'e dahil mi?
- SAST tool'u kullanılacak mı?
- Tool çıktıları manual doğrulanacak mı?
- Reviewer hangi language ve framework deneyimine sahip?
- Business logic ve authorization özel olarak incelenecek mi?
- Review coverage nasıl raporlanacak?
- Bulgu için file, function ve code path verilecek mi?
- Root cause ve systemic pattern araştırılacak mı?
- Fix review dahil mi?
- Source code nerede işlenecek?
- Local copy ve temporary artifact ne zaman silinecek?
- Review sırasında bulunan secret nasıl bildirilecek?
- Rapor code snippet'leri nasıl korunacak?
Sadece SAST scanner çalıştırılıp analyst tarafından export edilen sonuç, kapsamlı Secure Code Review olarak sunulmamalıdır.
Efor nasıl hesaplanmalı?
SAST tarama süresi ile Secure Code Review eforu aynı ölçütle hesaplanamaz.
SAST eforunu etkileyen faktörler
- Repository sayısı
- Language ve framework çeşitliliği
- Build complexity
- LOC ve module sayısı
- Scan mode
- Tool deployment modeli
- Rule tuning ihtiyacı
- Initial finding hacmi
- Integration sayısı
- Triage ownership
Secure Code Review eforunu etkileyen faktörler
- Architecture karmaşıklığı
- Kritik business workflow sayısı
- Authentication ve authorization modeli
- Tenant ve role matrisi
- Sensitive data flow sayısı
- Custom framework ve security control'ler
- Code quality ve documentation seviyesi
- Language ve framework uzmanlığı
- Review türü
- Önceki finding ve incident geçmişi
- İncelenecek change büyüklüğü
LOC yardımcı bir kapasite ölçüsüdür, fakat tek başına fiyatlandırma veya coverage ölçütü olmamalıdır. Bin satırlık custom token verifier, yüz bin satırlık generated CRUD code'dan daha fazla güvenlik eforu gerektirebilir.
Başarı nasıl ölçülmeli?
Finding sayısı başarı metriği değildir. Çok finding üreten tool daha iyi, daha az finding çıkaran reviewer daha zayıf kabul edilemez.
SAST için anlamlı metrikler
- Scan success ve health oranı
- Desteklenen repository ve language coverage'ı
- New code finding sayısı
- Manual validation sonrası precision
- False positive oranı
- Finding yaş ortalaması
- Mean time to remediate
- Suppression sayısı ve expiry durumu
- Tekrarlayan vulnerability class
- Custom rule adoption
- Pipeline feedback süresi
- Tool failure'ın temiz sonuç sayılma oranı
Secure Code Review için anlamlı metrikler
- İncelenen security requirement sayısı
- Kapsanan critical component ve data flow
- Bulunan systemic root cause sayısı
- Aynı root cause'a bağlı ek instance sayısı
- Regression test'e çevrilen finding oranı
- Custom SAST rule'a çevrilen pattern sayısı
- Fix review başarı oranı
- Production'a kaçan vulnerability oranı
- Aynı vulnerability class'ın tekrarı
- Review feedback lead time
Birleşik program için anlamlı metrikler
- SAST'ın işaretleyip reviewer'ın doğruladığı finding oranı
- Reviewer'ın bulduğu, SAST'ın kaçırdığı vulnerability sınıfları
- Manual bulgudan üretilen otomatik control sayısı
- False positive tuning sonrası developer kabul oranı
- Release öncesi ve production sonrası bulgu dağılımı
- Root cause remediation sonrası tekrar oranı
Metriklerin amacı ekipleri finding üretmeye zorlamak değil, unknown risk'i ve tekrar eden hatayı azaltmaktır.
LLM ve AI destekli code review bu ayrımı değiştirir mi?
LLM tabanlı code review araçları source code'u açıklayabilir, suspicious logic önerebilir, finding triage'ına yardımcı olabilir ve klasik rule'ların yakalamadığı pattern'ler hakkında hypothesis üretebilir. Bu kabiliyet değerlidir, fakat “AI kullanan tool artık Secure Code Review yapıyor” sonucu otomatik olarak çıkmaz.
Değerlendirilmesi gereken sınırlar şunlardır:
- Context window bütün code path'i kapsıyor mu?
- Model repository'nin tamamını mı, seçili snippet'i mi görüyor?
- Architecture ve business requirement modele verildi mi?
- Üretilen finding deterministic ve tekrar edilebilir mi?
- Data flow gerçekten kanıtlanmış mı, tahmin mi edilmiş?
- Hallucinated API veya code path var mı?
- Source code external model provider'a gönderiliyor mu?
- Prompt, response ve artifact retention nasıl yönetiliyor?
- Model version değiştiğinde sonuç nasıl karşılaştırılacak?
- Finding uzman reviewer tarafından doğrulanıyor mu?
LLM, SAST ile manual review arasında yeni bir yardım katmanı oluşturabilir. Fakat security ownership, evidence ve validation ihtiyacını kaldırmaz. AI-generated finding de source, sink, precondition, code path ve impact kanıtı taşımalıdır.
Source code gizliliği iki yöntemde nasıl değişir?
SAST platformu cloud-hosted ise repository içeriği veya derived representation kurum dışına çıkabilir. Manual reviewer da local clone alabilir. İki yöntemde de data handling açıkça tanımlanmalıdır.
Kontrol listesi şunları içermelidir:
- Source code hangi environment'ta analiz ediliyor?
- Cloud upload var mı?
- Data hangi ülkede tutuluyor?
- Tool training veya telemetry için kod kullanıyor mu?
- Retention süresi ne?
- Repository erişimi named account ve MFA ile mi?
- Least privilege uygulanıyor mu?
- Log ve temporary artifact'lar ne zaman siliniyor?
- Reviewer'ın cihazı ve storage alanı şifreli mi?
- Rapor içindeki snippet'ler maskeleniyor mu?
- Secret finding için secure communication channel var mı?
- On-premise veya air-gapped mode gerekiyor mu?
Yüksek hassasiyetli source code için hem SAST engine hem manual review müşteri ortamında çalıştırılabilir.
Compliance açısından hangisi gerekir?
Compliance requirement'ı kullanılan standarda, scope'a ve assurance seviyesine göre değişir. Ancak modern çerçeveler genellikle tek bir tekniğe güvenmez.
NIST SSDF, code review ve code analysis yöntemlerinin software lifecycle aşamasına göre seçilmesini, static analysis finding'lerinin insan tarafından review edilmesini ve sonuçların development workflow'unda triage edilmesini örnekler. NISTIR 8397 ise threat modeling, automated testing, static scanning, heuristic secret detection ve human review dahil birden fazla developer verification tekniğini birlikte ele alır.
OWASP ASVS 5.0.0, application security requirement'larını sözleşme ve verification kapsamı için kullanılabilir hale getirir. ASVS bir SAST rule listesi değildir. Requirement'ın hangi yöntemle doğrulanacağı uygulamanın riskine ve kontrolün yapısına göre seçilir.
Compliance için tool report sunmak, security requirement'ın karşılandığını her zaman kanıtlamaz. Benzer biçimde “manual review yapıldı” ifadesi de scope, version, reviewer coverage ve evidence olmadan yeterli değildir.
Karar tablosu: Hangi durumda hangisi öncelikli?
| Senaryo | SAST | Secure Code Review | Önerilen yaklaşım |
|---|---|---|---|
| Her pull request'te hızlı feedback | Çok uygun | Seçici | SAST sürekli, high-risk diff manual |
| Yeni authentication sistemi | Gerekli | Kritik | İkisi birlikte |
| Multi-tenant authorization | Yardımcı | Kritik | Requirement ve code path odaklı manual review |
| Büyük legacy repository | Baseline için güçlü | Risk bazlı | SAST ile hotspot, odaklı baseline review |
| Tekrarlanan injection problemi | Çok güçlü | Root cause için gerekli | SAST ile repo-wide tarama, manual model doğrulaması |
| Payment ve refund workflow'u | Sınırlı sinyal | Kritik | Manual business logic review ve runtime test |
| Cryptographic API migration | Güçlü | Protocol için gerekli | Unsafe API scan ve expert review |
| Küçük low-risk UI değişikliği | Uygun | Her zaman gerekmez | Incremental SAST ve normal peer review |
| Incident sonrası benzer bug araması | Çok güçlü | Kritik | Pattern scan, root cause ve alternate path review |
| Custom framework | Tuning olmadan zayıf | Kritik | Manual modelleme ve custom rule geliştirme |
| Source code dışarı çıkamaz | On-premise tool | Müşteri ortamında | Air-gapped veya on-premise hybrid çalışma |
| Compliance evidence | Tek başına yetersiz olabilir | Scope'a göre gerekli | Requirement bazlı çoklu verification |
Yaygın hatalar
Ham SAST çıktısını Secure Code Review raporu olarak sunmak
Tool finding'lerine analyst severity eklenmesi değerli triage'dır. Fakat architecture, trust boundary, business logic ve sistematik code path incelemesi yapılmadıysa hizmetin kapsamı açıkça “SAST ve manual validation” olarak adlandırılmalıdır.
SAST temizse manual review'e gerek olmadığını düşünmek
Clean scan yalnızca tool'un etkin rule, model ve coverage'ı içinde finding bulunmadığını gösterir. Custom authorization, business logic, race condition ve fail-open riskleri devam edebilir.
Manual review varsa SAST'ı gereksiz görmek
İnsan reviewer context konusunda güçlüdür, fakat büyük codebase'deki tekrarlanan pattern'i her commit'te aynı tutarlılıkla tarayamaz. SAST genişlik ve süreklilik sağlar.
Tool finding'lerini doğrulamadan developer'a göndermek
False positive hacmi developer güvenini azaltır. Bir süre sonra gerçek finding'ler de gürültü olarak görülür. Security team triage, tuning ve owner desteği sağlamalıdır.
Yalnızca OWASP Top 10 label'ına bakmak
Bir tool'un “OWASP Top 10 coverage” iddiası her requirement ve vulnerability instance'ını bulduğu anlamına gelmez. Kategoriler geniştir ve bazıları design ile business context gerektirir.
Scan health'i kontrol etmemek
Build fail, parser error veya skipped module varken raporun düşük finding üretmesi yanlış güven yaratır. Scan completeness ayrı control olmalıdır.
Review scope'unu yalnızca LOC ile tanımlamak
Security-sensitive code yoğunluğu her module'de aynı değildir. Scope critical flow, component ve requirement üzerinden yazılmalıdır.
Suppression'ları süresiz bırakmak
Bugün güvenli olan flow, sanitizer değiştiğinde riskli hale gelebilir. Suppression owner, rationale ve expiry taşımalıdır.
Manual bulguyu otomasyona geri taşımamak
Aynı bug class bir kez bulunduğunda repository genelinde aranmalı ve mümkünse custom rule veya regression test'e dönüştürülmelidir.
Sonuç: SAST genişliği, Secure Code Review anlamı sağlar
Secure Code Review ile otomatik SAST taraması arasındaki fark “insan daha akıllı, tool daha hızlı” cümlesinden daha derindir.
SAST, önceden tanımlı güvenlik bilgisini geniş codebase üzerinde tekrar edilebilir hale getirir. Riskli API, unsafe pattern ve source-to-sink data flow'ları sürekli arar. Yeni code change'lere hızlı feedback verir ve daha önce öğrenilen vulnerability pattern'inin yeniden ortaya çıkmasını engellemeye yardımcı olur.
Secure Code Review ise kodun neden güvenli olması gerektiğini sorar. User role, tenant, business invariant, trust boundary, failure state ve architecture ilişkisini değerlendirir. Bir finding'in yalnızca hangi satırda olduğunu değil, hangi security assumption'ın kırıldığını ve aynı root cause'un nerelere yayıldığını gösterir.
İki yöntemin de tek başına eksik kaldığı alan vardır.
Sadece SAST kullanan kurum, tool'un rule ve model dünyasının dışında kalan business risk'leri kaçırabilir. Sadece manual review kullanan kurum, büyük repository'deki tekrarlanan code pattern'leri ve her commit'teki regression'ları sürdürülebilir biçimde izleyemeyebilir.
Doğru model şudur:
- 1Security requirement ve threat scenario'ları tanımlayın.
- 2SAST'ı her code change için hızlı ve ölçülebilir feedback katmanına dönüştürün.
- 3Scan health, rule coverage ve false positive tuning'i yönetin.
- 4High-risk component ve değişiklikleri Secure Code Review'e alın.
- 5SAST finding'lerini application context ve insan muhakemesiyle doğrulayın.
- 6Manual bulguların benzerlerini repository genelinde arayın.
- 7Tekrarlanabilir pattern'leri custom rule ve regression test'e çevirin.
- 8Fix'i source code üzerinde ve gerekiyorsa runtime'da yeniden doğrulayın.
Secnodex, Secure Code Review çalışmalarını ham scanner çıktısı olarak sunmaz. SAST görünürlüğünü manual data flow, authorization, business logic ve root cause analiziyle birleştirerek bulgunun hangi security requirement'ı ihlal ettiğini ve nasıl sistemik biçimde giderileceğini ortaya koyar. Uygulamanız için SAST, Manual Source Code Review veya birleşik kaynak kod analizi kapsamı oluşturmak üzere Secnodex ile iletişime geçebilirsiniz.
Kaynaklar
- OWASP Secure Code Review Cheat Sheet
- OWASP Code Review Guide
- OWASP Static Code Analysis
- OWASP Application Security Verification Standard 5.0.0
- OWASP Top 10:2025 – Establishing a Modern Application Security Program
- NIST SP 800-218: Secure Software Development Framework
- NISTIR 8397: Guidelines on Minimum Standards for Developer Verification of Software
- NIST SATE VI Report
- MITRE CWE-862: Missing Authorization
- MITRE CWE-863: Incorrect Authorization
Sık sorulan sorular
Secure Code Review ile otomatik SAST taraması farkı nedir?
SAST rule ve program analysis kullanarak riskli code pattern ve data flow'ları otomatik arar. Secure Code Review ise insan uzmanlığıyla security requirement, business logic, trust boundary ve implementation context'ini değerlendirir.
SAST, Secure Code Review'in yerini tutar mı?
Hayır. Business logic, custom authorization, race condition, fail-open ve design-level risklerde context eksik kalır. SAST geniş ve sürekli visibility sağlar, fakat manual security reasoning'i tamamen değiştirmez.
Secure Code Review, SAST'ın yerini tutar mı?
Hayır. Büyük codebase'deki tekrarlanan unsafe pattern'leri her commit'te tutarlı ve hızlı taramak için otomasyon gerekir. Manual review riskli akışlara derinlik kazandırır.
Secure Code Review tamamen manuel mi yapılır?
Core karar insan reviewer tarafından verilir, fakat SAST, code search, call graph, IDE, debugger ve custom query gibi araçlar kullanılabilir. Tool kullanılması manual review niteliğini ortadan kaldırmaz.
SAST bulgularının tamamı gerçek açık mıdır?
Hayır. Bir finding false positive, unreachable code veya security hotspot olabilir. Input kontrolü, path reachability, sanitizer, runtime ve compensating control manual olarak değerlendirilmelidir.
Manual reviewer'ın bulduğu her şey gerçek açık mıdır?
Hayır. Reviewer framework behavior'ı veya security requirement'ı yanlış yorumlayabilir. Finding developer walkthrough, code evidence ve gerektiğinde runtime validation ile doğrulanmalıdır.
SAST business logic açığı bulabilir mi?
Genel SAST tool'ları business rule'ü kendiliğinden bilmez. Kuruma özgü invariant ve anti-pattern rule'a dönüştürülürse bazı örnekler bulunabilir. Yine de multi-step abuse ve state transition için manual review önemlidir.
SAST IDOR bulabilir mi?
Framework-specific missing authorization pattern'leri veya unsafe repository call'ları modellenmişse aday finding üretebilir. Ancak object ownership ve tenant rule context gerektirdiği için manual doğrulama gerekir.
Secure Code Review ne kadar sürer?
Süre yalnızca LOC'a bağlı değildir. Architecture, critical flow, role ve tenant modeli, language, custom framework ve review türü belirleyicidir. Scope görüldükten sonra risk bazlı efor hesaplanmalıdır.
SAST ne kadar sürede çalışır?
Basit incremental scan dakikalar içinde tamamlanabilir. Büyük monorepo, build-required analysis ve derin interprocedural scan daha uzun sürebilir. Hız, analysis depth ve infrastructure ile birlikte değerlendirilmelidir.
SAST her commit'te çalışmalı mı?
Hızlı ve yüksek precision rule'lar her pull request'te çalışabilir. Daha derin full scan nightly veya release aşamasına alınabilir. Tool failure temiz sonuç olarak kabul edilmemelidir.
Secure Code Review her pull request'te yapılmalı mı?
Normal peer review her pull request'te olabilir. Uzman Secure Code Review ise high-risk path, security-sensitive change ve önceden tanımlı trigger'larda uygulanabilir. Security champion modeli coverage'ı artırabilir.
SAST ile SCA aynı şey mi?
Hayır. SAST first-party code içindeki weakness'leri analiz eder. Software Composition Analysis third-party dependency, version, CVE, license ve supply chain bilgisini değerlendirir. Bazı platformlar iki özelliği birlikte sunduğu için terimler karışabilir.
Secret scanning SAST mıdır?
Her zaman değil. Secret scanning entropy, pattern ve credential formatlarına odaklanan ayrı bir capability olabilir. Aynı platform içinde sunulsa da scope ve detection mantığı farklıdır.
LLM code review, Secure Code Review sayılır mı?
Tek başına sayılmaz. LLM finding üretebilir ve reviewer'a yardımcı olabilir. Ancak architecture context, business requirement, deterministic evidence, source code gizliliği ve manual validation ayrıca yönetilmelidir.
En iyi sonuç nasıl elde edilir?
SAST bütün repository ve change'lerde sürekli çalıştırılır. High-risk component ve flow'lar Secure Code Review'e alınır. Manual bulgular custom rule ve regression test'e çevrilir. Release öncesinde runtime sızma testiyle exploitability doğrulanır.
Okumaya devam et
Kaynak Kod Analizi
SAST Nedir, Hangi Açıkları Bulur, Hangilerini Kaçırır?
SAST, uygulama çalıştırılmadan source code, bytecode veya binary üzerinde güvenlik analizi yapar. Injection ve riskli API kullanımında güçlüdür; ancak business logic, IDOR ve runtime configuration gibi kritik riskleri tek başına kapsayamaz.
Yazıyı okuKaynak Kod Analizi
Kaynak Kod Analizi ile Sızma Testi Aynı Problemi Çözmez: Nerede Ayrışır?
Kaynak kod analizi uygulamanın nasıl yazıldığını, sızma testi ise çalışan sistemde neyin gerçekten istismar edilebildiğini inceler. Aralarındaki farkı teknik örneklerle ele alıyoruz.
Yazıyı oku