SecAudit
RealVuln 2.0.0Tier 02026-08-20 koşusu

Başkasının veri kümesi,başkasının puanlayıcısı.

62 gerçek depoda 1762 etiketli zafiyet; hiçbiri burada etiketlenmedi, hiçbiri burada puanlanmadı. Bu sayfa sonucun tamamı — gurur verici olmayan kısımlar dahil: hâlâ sıfıra yakın duran dört aile, etiketli hiçbir şeyin bulunamadığı 0 depo ve bu sayının üç tur önce kör olmaktan çıktığı açıklaması.

secaudit · Tier 0 only (--no-deps --no-scanners, no LLM) — ağ yok, API anahtarı yok, ücretli plan yok.

result.json · genel (micro)1762 etiket
  • 61.2F3 (recall × 9)
  • 61.6F2
  • 0.656precision
  • 0.607recall
  • 1070doğru pozitif
  • 561yanlış pozitif
  • 692kaçırılan
  • 248doğru negatif

Aynı puanlayıcı, aynı koşunun daha katı bir okumasını da veriyor: F3 57.0, recall 0.5623; aynı 1070 doğru pozitif üzerinde 141 etiketi daha kaçırılmış sayarak. Bu koşunun dürüst aralığı 57.0 – 61.2. micro alıntılanıyor çünkü kıyaslamanın kendi referans değerleri bu agregada yayımlanmış; başka her amaç için kullanılacak rakam 57.0.

Açık beyansayıyı aktarmadan önce okuyun

Bu sayı kör değil ve üç turdur kör değil.

İlk iki koşu kördü: çekirdek bu veri kümesini hiç görmemişti ve okumadığı kod üzerinde aldığı skor 12.5 idi. Sonraki her koşu, kıyaslamanın kendi yanlış negatifleri okunup eksik kurallar yazıldıktan sonra ölçüldü.

12.5 kör — çekirdek bu veri kümesini okumamıştı
61.2 şimdi, veri kümesine bakılarak geçen üç turun ardından

Eklenen kuralların tamamı, herhangi bir SAST aracının zaten içerdiği türdendir — token için zayıf PRNG, çerez bayrakları, CSRF muafiyetleri, commit'lenmiş yedek imza anahtarı, açık yönlendirme, loglara düşen kimlik bilgileri — yani hiçbiri belirli bir fixture'a göre şekillendirilmemiştir. Ancak seçim üç kez veri kümesine bakılarak yapılmıştır ve avantaj birikmektedir. 12.5 ile 61.2 arasındaki fark bu avantajın büyüklüğüdür. Görülmemiş bir kod tabanı için temkinli rakam 12.5'tir; bu ölçümün dürüst devamı, bu deponun hiç görmediği bir kıyaslamadır.

Koşu geçmişitek veri kümesi, 30 koşu

Her turun skoru ve o skorun maliyeti.

Aynı veri kümesi, aynı puanlayıcı, aynı klon. Her tur önce bir önceki çekirdeği güncel checkout üzerinde yeniden puanlıyor ve commit'lenmiş rakamlarını hane hane yeniden üretiyor; hareketi veri kümesine değil çekirdeğe bağlayan şey bu.

TurF3F2 precisionrecall TP / FP / FN
2026-08-12ilk koşu — kör; çekirdeğin okumadığı bir veri kümesi üzerinde12.513.50.40720.1158204 / 297 / 1558
2026-08-13ilk koşunun teşhisine yönelik; veri kümesinin geri kalanına hâlâ kör13.314.40.39250.1243219 / 339 / 1543
2026-08-13yapılandırma ve kripto hijyeni turu, veri kümesine bakılarak24.626.10.50370.2327410 / 404 / 1352
2026-08-13ilk yapısal tur — yetkilendirme ve ReDoS26.027.50.51060.2463434 / 416 / 1328
2026-08-13yapısal analizler: hız sınırı, yüklemeler, toplu atama30.932.50.54050.2951520 / 442 / 1242
2026-08-13hız sınırı kuralı daraltıldı (F3 31.5)31.533.00.54190.3008530 / 448 / 1232
2026-08-16dil aileleri, vendor'lanmış dosyalar, şablon XSS, Python SQL35.837.70.66010.3405600 / 309 / 1162
2026-08-16vendor'lanmış dosya filtresi35.938.00.70750.3405600 / 248 / 1162
2026-08-16JavaScript turu: ReDoS ön yüzü, prototype pollution yeniden yazımı, yayımlanan build çıktısı35.938.00.70750.3405600 / 248 / 1162
2026-08-16prototype pollution: yalnızca çağıranın seçtiği bir anahtar35.938.00.70840.3405600 / 247 / 1162
2026-08-16pathlib: hiçbir şeyin modellemediği sink kütüphanesi39.341.30.70860.3740659 / 271 / 1103
2026-08-16req.url: hiçbir şeyin modellemediği Node kaynağı39.341.30.70860.3740659 / 271 / 1103
2026-08-172026-08-16 turu, yeniden ölçüldü: 271 değil 273 yanlış pozitif39.241.30.70710.3740659 / 273 / 1103
2026-08-17karesel ReDoS ve JavaScript deseninin çalıştığı yerde raporlanması39.241.30.70410.3740659 / 277 / 1103
2026-08-17prototype pollution: kimsenin sınırlayamadığı fonksiyonlar, callback'in anahtarı ve ağaç gezinmesi39.241.30.70330.3740659 / 278 / 1103
2026-08-17import ile çözümlenen shell ve vm alıcıları39.241.30.70330.3740659 / 278 / 1103
2026-08-17Yapılandırma + kimlik bilgileri41.643.50.67180.3995704 / 344 / 1058
2026-08-18Veri kümesinin hiç karşılığı olmayan dokuz kural ailesi59.560.30.67600.58741035 / 496 / 727
2026-08-18Django view'ları artık varsayılan olarak herkese açık sayılmıyor59.760.40.66950.58971039 / 513 / 723
2026-08-19HttpOnly kuralının gizlediği Secure çerez bayrağı60.661.10.65590.60051058 / 555 / 704
2026-08-19Birleştirmeyle kurulan HTML — JavaScript XSS etiketlerinin yaşadığı yer60.560.90.64710.60051058 / 577 / 704
2026-08-19PHP bir ölçüm aracı kazandı ve araç üç bozuk kural buldu60.560.90.64710.60051058 / 577 / 704
2026-08-19PHP superglobal kuralları — kaynak, sink'in içinde yazılı60.560.90.64710.60051058 / 577 / 704
2026-08-19Dosyayı değil satırı okuyan bir susturma60.560.90.64710.60051058 / 577 / 704
2026-08-19Vendor'lanmış bir kütüphane tek dosya olarak gelmez60.561.10.65770.59991057 / 550 / 705
2026-08-19PHP taint — tek atama sıçraması, tek dosya60.561.10.65770.59991057 / 550 / 705
2026-08-19JavaScript'e sorulamayan üç yapısal soru60.561.10.65770.59991057 / 550 / 705
2026-08-20Gürültü tabanında gerçek bir uygulama ve bulduğu iki kusur60.561.10.65770.59991057 / 550 / 705
2026-08-20Framework'ün kendi login'i: okunacak handler'ı olmayan bir rota61.161.60.65620.60671069 / 560 / 693
2026-08-20SSRF sıradan HTTP yüzeyine ulaşıyor; debug anahtarının dört yazımı61.261.60.65600.60731070 / 561 / 692

İlkinden sonraki her turda precision, recall ile birlikte yükseliyor. Depo bunu “bunlar kural, eğri uydurma değil” sinyali sayıyor; precision'ın düştüğü bir tur ise kuralı korumak yerine durup daraltma sinyalidir.

Referans değerler

Kıyaslamanın kendi yayımladığı rakamlara karşı.

RealVuln her kategori için en iyi bildirilen rakamı yayımlar. Aşağıdaki dört satırın üçü RealVuln'a aittir; kalın olan satır bu çekirdektir ve aynı veri kümesinde, aynı puanlayıcıyla ölçülmüştür. Bu sayfadaki her rakam puanlayıcının kendi biriminde bırakılmıştır — F3 0–100 aralığında, precision ve recall kesir olarak — böylece satırlar yayımlanmış tabloyla karşılaştırılabilir kalır. Ana sayfa aynı ölçümleri baştan sona yüzde olarak verir.

KategoriEn iyi bildirilenF3 precisionrecall
Security-specializedKolega.Dev73.00.3880.809
General-purpose LLMClaude Sonnet 4.651.70.7850.498
Rule-based SASTSemgrep17.70.2050.175
Rule-based SAST + taint + structuralSecAudit Tier 061.20.65600.6073

Kural tabanlı SAST'ın üzerinde, her iki metrikte de; genel amaçlı bir modelin ve amaca özel sistemin ise çok altında — ve o ikisi, bunun artık ölçülmediği biçimde ölçülmüştü. Doğru iddia “Semgrep'ten iyi” değil, “sonradan okuduğumuz bir veri kümesinde Semgrep'in üzerinde”.

Recall nereye gidiyor

Her aile, en büyük etiket havuzu önce.

Sıralama, çubuklardan daha önemli: en üstteki dört aile veri kümesindeki bütün etiketlerin yarısından fazlasını tutuyor ve bu katmanın en kötü olduğu dört aile de onlar. Bir skoru büyük havuzlar belirler, tarayıcının kolay bulduğu havuzlar değil.

  • other536 / 83165%
  • sensitive_data_exposure61 / 14143%
  • security_misconfiguration90 / 10883%
  • xss49 / 9850%
  • broken_access_control2 / 763%
  • missing_auth7 / 749%
  • sql_injection67 / 7194%
  • hardcoded_credentials25 / 5248%
  • command_injection39 / 4685%
  • denial_of_service31 / 4470%
  • open_redirect37 / 4092%
  • path_traversal23 / 3959%
  • ssrf16 / 3743%
  • xxe32 / 3689%
  • insecure_deserialization27 / 3479%
  • code_injection28 / 3093%
  • xpath_injection0 / 40%
  • http_header_injection0 / 10%

Desen sınıfları tavanına yakın — komut enjeksiyonu, açık yönlendirme, kod enjeksiyonu ve XXE hepsi %80'in üzerinde. Skoru belirleyen havuzlar ise desen sınıfı değil: sensitive_data_exposure ve security_misconfiguration etiketlerinin yaklaşık 130'u bir fonksiyon tanımının üzerinde duruyor — broken_access_control ve missing_auth ile aynı biçim. Bunlar başka bir kural değil, iş mantığı geçişi istiyor ve burada eklenen hiçbir kural onlara dokunmadı.

Depo bazında66 deponun 62 tanesi

Hepsi, en iyiden başlayarak — hiçbir şey bulunamayanlar dahil.

F3'e göre sıralı. İlk beş yerine tamamı yayımlanıyor; çünkü bu projenin kendi sayfasındaki ilk beş, puanlayıcı çıktısıyla karşılaştırılana kadar iki tur bayattı ve kimsenin denetlemediği bir sıralama kendini kayırır.

DepoF3 precisionrecall TPFPFN
vc-codex-high-seeded-v2-marketplace-commerce-fastapi85.60.6880.88022103
vc-codex-high-seeded-v2-fintech-lending-fastapi81.60.7270.8282495
vc-codex-seeded-v2-logistics-dispatch-fastapi79.70.7740.8002476
vc-codex-high-seeded-v2-support-desk-fastapi77.50.6880.78622106
vc-codex-high-seeded-v2-logistics-dispatch-fastapi77.20.6220.79323146
vc-codex-high-seeded-v2-property-management-fastapi76.60.5250.80821195
vc-kimi-code-seeded-v2-property-management-fastapi76.40.7420.7672387
vc-codex-high-seeded-v2-hr-payroll-django76.00.7600.7601966
vc-kimi-code-seeded-v2-crm-saas-django73.80.7140.7412087
vc-kimi-code-seeded-v2-hr-payroll-django73.60.5790.75922167
vc-codex-seeded-v2-property-management-fastapi73.50.6760.74223118
vc-codex-high-seeded-v2-crm-saas-django73.10.5430.76019166
vc-codex-high-seeded-v2-education-lms-django73.10.5430.76019166
vc-claude-code-seeded-v2-logistics-dispatch-fastapi72.70.7270.7272499
intentionally-vulnerable-python-app72.50.8330.714512
vc-codex-high-seeded-v2-legal-case-django71.70.6920.7201887
lets-be-bad-guys71.10.7390.7081767
vc-codex-seeded-v2-support-desk-fastapi70.70.7780.7002169
vc-kimi-code-seeded-v2-logistics-dispatch-fastapi70.70.6880.71022109
vc-kimi-code-seeded-v2-legal-case-django70.00.7830.6921858
vc-claude-code-seeded-v2-marketplace-commerce-fastapi69.80.8150.68822510
vc-claude-code-seeded-v2-legal-case-django69.60.5950.71022159
vc-kimi-code-seeded-v2-marketplace-commerce-fastapi69.30.6130.70419128
vfapi69.01.0000.667603
vc-kimi-code-seeded-v2-support-desk-fastapi67.90.6790.6791999
vc-kimi-code-seeded-v2-healthcare-clinic-django67.80.8000.66720510
vc-claude-code-seeded-v2-support-desk-fastapi67.40.6570.676231211
vc-claude-code-seeded-v2-crm-saas-django67.10.6130.67919129
vc-kimi-code-seeded-v2-fintech-lending-fastapi67.10.7100.66722911
vc-codex-seeded-v2-marketplace-commerce-fastapi66.40.7600.65519610
vc-codex-seeded-v2-crm-saas-django66.10.8150.64722512
vc-codex-high-seeded-v2-healthcare-clinic-django65.40.6540.6541799
vc-claude-code-seeded-v2-fintech-lending-fastapi64.60.5760.655191410
vc-codex-seeded-v2-education-lms-django64.50.8460.62922413
vc-claude-code-seeded-v2-property-management-fastapi64.00.6770.636211012
vc-codex-seeded-v2-hr-payroll-django63.30.8570.61524415
vulpy63.00.5000.649373720
vc-claude-code-seeded-v2-healthcare-clinic-django62.70.4520.655192310
vc-claude-code-seeded-v2-education-lms-django62.30.6060.625201312
vc-codex-seeded-v2-legal-case-django61.90.7690.60620613
vc-codex-seeded-v2-fintech-lending-fastapi61.10.8150.59522515
vc-kimi-code-seeded-v2-education-lms-django60.70.6070.607171111
vc-claude-code-seeded-v2-hr-payroll-django60.50.4470.630172110
dvblab60.20.7220.5911359
vc-codex-seeded-v2-healthcare-clinic-django58.10.8520.56123418
insecure-web57.50.8330.556514
damn-vulnerable-flask-app54.40.6670.533847
threatbyte53.60.5180.538141312
python-ssti52.61.0000.500101
vulnpy49.50.7920.475381042
vulnerable-flask-app42.90.4290.42991212
vulnerable-python-apps42.30.6000.4099613
python-insecure-app40.01.0000.375305
vampi39.50.3530.4006119
djangoat37.20.4420.365192433
extremely-vulnerable-flask-app36.20.6880.34411521
dvpwa32.30.7000.3047316
flask-xss31.60.6000.3009621
dsvw27.90.8750.2597120
vulnerable-tornado-app22.70.5000.2143311
dsvpwa20.30.7500.1886226
dvga14.80.3570.1395931

62 deponun 0 tanesi 0.0 aldı; ikisinde de etiketli hiçbir bulgu tespit edilmedi. Her ikisi de tablonun sonunda yer alır. Aşağıdaki gerekçe kıyaslama deposundan birebir alındığı için İngilizcedir: çevrilmiş bir kopya, kaynak değiştiğinde sessizce yanlış hâle gelirdi.

Neyin puanlanmadığı ve bunun neden önemli olduğu

  • realvuln-owasp-web-playground
  • realvuln-pygoat
  • realvuln-python-app
  • realvuln-vulnerable-api

Upstream repositories are gone - git clone returns 'Repository not found' for all four. Not a choice made here, and not a random sample: all four are deliberately vulnerable teaching apps, the densest and most pattern-obvious repos in the corpus, so their absence works against this score rather than for it.

Diğer diliki koşu

JavaScript tarafı ne yapıyor — ve bunu okumadan önce ne yapıyordu.

Yukarıdaki her rakam Python'ı anlatıyor. Bu rakam JavaScript'i anlatıyor ve iki kez ölçüldü. İlk koşu kördü — bu çekirdekteki hiçbir kural o an bu kıyaslamanın etiketleri okunarak yazılmamış ya da seçilmemişti — ve 0.2286 aldı. Hiç görülmemiş kodun rakamı odur ve iyileşmez. Kör koşunun getirdiği şey bir teşhis oldu; buradaki sayı ona göre hareket edildikten sonraki sayı. İki veri kümesi hiçbir yönde kıyaslanamaz — o veri kümesi uygulamalardan, bu veri kümesi kütüphanelerden oluşuyor ve bir kütüphanenin, erişilebilirlik analizinin başlayabileceği bir istek işleyicisi yoktur.

SecBench.js2026-08-20
  • 54.4%recall
  • 312bulunan sink
  • 573etiketli sink
  • 575npm paketi

Burada sağlam olan metrik recall ve yayınlanan tek metrik o. Kıyaslama paket başına tek bir açık etiketliyor ve paketin geri kalanı hakkında hiçbir şey söylemiyor; dolayısıyla eşleşmeyen bulgu oranı bir precision değil, gürültü için bir alt sınır olurdu — onu yukarıdaki rakamın yanına koymak, adı aynı olan iki farklı ölçümü kıyaslamak olurdu.

  • redos28 / 8732.2%
  • prototype-pollution72 / 18538.9%
  • command-injection62 / 10161.4%
  • code-injection22 / 3366.7%
  • path-traversal128 / 16776.6%

Kör koşu üç şey söyledi; her biri şuna dönüştü. ReDoS sıfır almıştı çünkü o analiz yalnızca Python içindi — tek bir paket çekilmeden önce yol haritasına yazıldı ki sonradan bir keşif gibi sunulamasın; artık JavaScript de okuyor ve 8/87, üstel geri izlemeyi tarif eden kriterlerin, gerçek raporların çoğunun polinomiyal olduğu bir dünyadaki dürüst karşılığı. Prototype pollution hâlâ en kötü sınıf, ama dokuzu bulan kural emekliye ayrıldı; yerine döngüyü değil yazma işlemini raporlayan bir analiz geldi. Ve dist/ ya da build/ altındaki 35 sink için "tespit hatası değil, kapsam kararı" denmişti — çekirdek artık paketin kendi manifesti oraları yayınlıyorsa okuyor, 29'u erişilebilir oldu ve ikisi bulundu. O iddia işin gurur okşayan yarısıydı ve yanlıştı.

Köken

İki digest, bir rakamın üretildiği çekirdekten uzun yaşamasını engeller.

Bir sayı, ancak onu neyin ürettiğini söyleyebiliyorsanız tekrar üretilebilirdir. Ground-truth digest'i veri kümesini sabitler; engine digest'i ölçülen koşunun çıktısını değiştirebilecek her modülü kapsar. Yayımlanmış bir rakamın onu üreten koddan uzun yaşaması burada varsayım değil — bütün kapılar yeşilken gerçekten oldu, çünkü hiçbir şey sonucu çekirdekle karşılaştırmıyordu. Artık bir kapı karşılaştırıyor.

Ground-truth digest'inin Windows'ta yeniden hesaplanması, birebir aynı veri kümesi için farklı bir değer üretir: ham baytlar hash'lenir ve yollar platform ayracıyla birleştirilir, yani hem CRLF hem de ters bölü sonucu değiştirir. LF'ye normalleştirme ve düz bölü kullanımıyla değer birebir yeniden üretilir.

result.json
  • Ground truthsha256:af5901bffc94380b50f31909655c12edfe0762e82162051d8b1238c66698593f
  • Çekirdeksha256:8f426cd2c1196ae15e6d5460220e6fa5041bd473a6d66cc2ad2806c9f8fc0db9
  • Kıyaslamahttps://github.com/kolega-ai/Real-Vuln-Benchmark · 2.0.0
  • KatmanTier 0 only (--no-deps --no-scanners, no LLM)
  • Yeniden doğrulandı2026-08-15

Tekrarlama

Baştan sona yaklaşık on beş dakika.

Buradaki hiçbir şeyi bu depo hesaplamıyor. run.py Semgrep formatında JSON yazar ve otorite kıyaslamanın kendi puanlayıcısıdır — kendini başkasının veri kümesine göre notlandıran bir araç, o veri kümesinin çözmek için var olduğu problemi geri getirmiş olur. 62 deponun tam taraması 1,4 dakika; gerisi klonlama.

66 deponun dördü hiç klonlanamıyor; dolayısıyla her tekrar üretim, bunun indiği yere — 62 depoya — iner.

git clone https://github.com/kolega-ai/Real-Vuln-Benchmark
cd Real-Vuln-Benchmark && python3 clone_repos.py && cd -

python3 eval/realvuln/run.py --benchmark ../Real-Vuln-Benchmark

cd ../Real-Vuln-Benchmark
for r in repos/*/; do python3 score.py --repo "$(basename "$r")" --scanner secaudit; done
python3 dashboard.py --scanners secaudit

Bir sonraki koşunun yeniden keşfetmemesi için dört not

  • 1

    score.py --repo alır ve tek seferde tek depo puanlar. --all-repos diye bir bayrak yok.

  • 2

    Windows'ta PYTHONUTF8=1 gerekir; yoksa puanlayıcı UTF-8 olmayan konsol kod sayfasında kendi markdown raporunu yazarken durur.

  • 3

    İkinci bir tarayıcıyı puanlamak, aynı tarihe ait depo bazlı skor kartlarının üzerine yazar. Önceki set, bir sonraki tarayıcı puanlanmadan önce alınmalıdır.

  • 4

    compute_gt_hash.py Windows'ta, birebir aynı veri kümesi için yayımlanmış digest ile uyuşmaz. LF'ye normalleştirme ve düz bölü kullanımıyla uyuşur; ilk okuma ground truth'un değiştiğini söyler ki bu, hiçbir koşunun bir diğeriyle kıyaslanamayacağı anlamına gelirdi.

Bu sayının söylemedikleri

Bu rakamın olmadığı üç şey.

  • 1

    LLM katmanının ölçümü değil

    Tier 1, deterministik katmanın yapısal olarak ulaşamadığı sınıflara ulaşması beklenen katman. Ölçmek buradaki her depo için ücretli çıkarım gerektiriyor ve bu, backlog değil açıkça belirtilmiş bir hedef-dışı. Katman varsayılan kapalı geliyor; onun yerine iddia daraltıldı.

  • 2

    JavaScript çekirdeğinin ölçümü değil

    RealVuln v1 yalnızca Python. Yapısal analizler bir JavaScript/TypeScript ön ucu kazandı; artık aynı dört soru iki dile de soruluyor ama iki cevaptan yalnızca biri başkası tarafından puanlandı. JS tarafı skor olarak değil, regresyon tabanı olarak geliyor.

  • 3

    Başka bir depo hakkında bir iddia değil

    Etiketlerin çoğunu tutan aileler hâlâ sıfıra yakın olanlar ve burada eklenen hiçbir desen onlara dokunmuyor. Kasten zafiyetli uygulamalardan oluşan bir veri kümesi, üretim kod tabanının biçimi de değil — iki yönde birden.

Bunların hiçbiri sonradan eklenmiş bir çekince değil. Her biri bu ölçümün ilk koşudan beri taşıdığı bir sınır — ve aracın yazdığı rapor da kendi sınırlarını aynı şekilde belirtir.

Rakamı üreten kodu inceleyin.

Puanlayıcı çıktısı depoda commit'lidir, koşum tek komuttur ve bu sayfadaki bir rakam ham sonuçla uyuşmadığında CI kapısı derlemeyi durdurur.