fix(diagnostics): sanitize sertlestirme - selfTest hatti, deny normalize, cycle guard#81
Merged
Merged
Conversation
…ize, cycle guard PR-1 (#80) sonrasi ortaya cikan UC sanitize bosluğu kapatildi. 1) selfTest bolumu sanitize'i TAMAMEN atliyordu reportSelfTestSnapshot raporu ham spread ediyordu ({...base, selfTest}) -> deny-list, VIN/MAC/koordinat/api_key maskeleri ve derinlik tavani bu bolume UYGULANMIYORDU. Prob `detail` alanlari SERBEST METIN tasir: ham Error.message (runProbe catch), ham fetch hata metni (probeBackend), stack karesi/dosya yolu (probeIdleRenderLoop) -> maskesiz kanal. Yeni `_sanitizeSection()` TEK KAPI: inspector ve selfTest ayni kapidan gecer; ileride eklenecek bolum sanitize'i atlayamaz. Teshis degeri KAYBOLMAZ - stack karesi okunur kalir, yalniz VIN/MAC/koordinat/anahtar maskelenir. 2) DENY_KEYS camelCase'e KORDU Eslesme `key.toLowerCase()` idi, set'te 'api_key' vardi -> apiKey.toLowerCase() = 'apikey' != 'api_key' -> SIZIYORDU. Anahtar artik NORMALIZE edilir (kucult + alfanumerik olmayani at) ve TAM ESLESME yapilir. Liste: apikey, accesstoken, refreshtoken, authorization, bearer, secret, password, jwt, token, email (+ mevcut konum/VIN/MAC/telefon). TAM eslesme ZORUNLU - substring/prefix YASAK: `lat` substring olsaydi `platform` (W4E runtime teshis bolumunun TAMAMI) ve `detectedPlatform` duserdi; `vin` prefix olsaydi `vinMasked` (VIN sizintisini ONLEMEK icin uretilen maskeli turev) silinirdi -> koruma raporu bosaltirdi. 326 anahtar tarandi: false-positive YOK. 3) Cycle guard YOKTU Ozyinelemeyi sinirlayan tek sey MAX_DEPTH'ti. Eklenen guard ANCESTOR-PATH desenidir (girerken ekle, finally ile cikarken sil): naif "gorulen nesneler" seti PAYLASILAN REFERANSI (ayni nesne iki KARDES dalda = DAG) cycle sanip ikinci dali sessizce bosaltirdi - DTC [null,null] ile ayni sinif sessiz kayip. Cycle -> [CYCLE] isareti (sessiz kayip DEGIL, gorunur); dizi elemaniysa ELENMEZ. Public API artik THROW ETMEZ: getter/Proxy patlarsa yalniz o DUGUM [UNREADABLE] olur, kardes alanlar akar -> tek zehirli alan TUM raporu olduremez. DEGISMEYEN (bilincli): MAX_DEPTH=6, MAX_ARRAY_LEN=20, MAX_STR_LEN=2048, mevcut MASKS, UI, RPC, DB/migration, riza, teslimat modeli ('sent' yalani AYRI PR). Byte olcumu (en zengin fixture, ayni test, once/sonra): self_test 5157 B -> 5119 B (-38 B; sanitize sonrasi hafif KUCULDU) dev_inspector 5479 B -> 5479 B (0; inspector zaten ayni kapidan geciyordu) Testler: 17 davranis kilidi (yeni dosya) + 4 kaynak-metin kilidi (regresyon kasasi; PR-1'in dizi kilidi KALDIRILMADI, yeni dogru davranisa GUNCELLENDI). Tam suite 3711 yesil (206 dosya), tsc temiz, lint 0 error, build OK. Ledger #63: DIRT KIRMIZI - gercek cihazda self-test raporu gorulmeden yesil YOK. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Drs9NzKMErjeNT24wLnDxX
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR-1 (#80) merge edildikten sonra ortaya çıkan üç sanitize boşluğu kapatılır. Tanı raporunun içeriği değişmez; sanitize hattının kapsamı ve dayanıklılığı sertleştirilir.
1.
selfTestbölümü sanitize'ı TAMAMEN atlıyordureportSelfTestSnapshotraporu ham spread ediyordu:Yani deny-list, VIN/MAC/koordinat/
api_keymaskeleri ve derinlik tavanı bu bölüme hiç uygulanmıyordu. Ve bu bölüm masum değil — probdetailalanları serbest metin taşır:runProbecatchError.messageprobeBackendcatchprobeIdleRenderLooptick@FullMapView.tsx:814)Çözüm: yeni
_sanitizeSection()— tek kapı.inspectorveselfTestartık aynı kapıdan geçer; ileride eklenecek bir bölüm sanitize'ı atlayamaz.Teşhis değeri kaybolmuyor: stack karesi (
FullMapView.tsx:814) okunur kalır; yalnız VIN/MAC/koordinat/anahtar maskelenir.2.
DENY_KEYScamelCase'e kördü — sırlar sızıyorduEşleşme
DENY_KEYS.has(key.toLowerCase())idi ve sette'api_key'vardı:Çözüm: anahtar normalize edilir (küçült + alfanümerik olmayanı at) ve tam eşleşme yapılır.
api_key·apiKey·API_KEY·Api-Key→ hepsiapikey.Liste genişledi:
apikey·accesstoken·refreshtoken·authorization·bearer·secret·password·jwt·token·email(+ mevcut konum/VIN/MAC/telefon/SSID).3. Cycle guard yoktu + public API throw edebiliyordu
Özyinelemeyi sınırlayan tek şey
MAX_DEPTH'ti; dairesel graf 6 kat açılıyordu. AyrıcaObject.keys/ getter / Proxy patlarsa tüm rapor düşüyordu (_deepSanitizetry/catch'siz,_triggerSnapshot'error'döndürüyordu → 15 sağlıklı bölüm çöpe).Çözüm — ancestor-path guard:
Naif "görülen nesneler"
WeakSet'i yanlış olurdu: aynı nesne iki kardeş dalda geçerse (DAG — cycle değil) ikinci dalı sessizce boşaltırdı. Bu, PR-1'de düzelttiğimiz DTC[null,null]ile aynı sınıf sessiz veri kaybı. Bu yüzden: özyinelemeye girerken ekle,finallyile çıkarken sil → bir nesne yalnız kendi atası olduğunda cycle'dır.[CYCLE]işareti. Sessiz kayıp değil, görünür — "alan yoktu" ile "alan dairesel olduğu için atıldı" ayrı şeyler.[UNREADABLE]olur, kardeş alanlar akar (_safeSection'ın düğüm-bazlı karşılığı). Tek zehirli alan artık tüm tanı raporunu öldüremez.Kapsam dışı (bilinçli — dokunulmadı)
MAX_DEPTH=6·MAX_ARRAY_LEN=20·MAX_STR_LEN=2048· mevcutMASKS(VIN/MAC/COORD/api_key=/token=) · UI · RPC · DB/migration · rıza & önizleme · teslimat modeli. Yalancı'sent'ayrı PR.Byte ölçümü — önce/sonra (aynı test, en zengin fixture)
self_testdev_inspectorself_testküçüldü (sanitize maskeleme + deny redaksiyonu);dev_inspectordeğişmedi çünkü inspector zaten aynı kapıdan geçiyordu. Şişme yok, ikisi de 64 KB sunucu tavanının çok altında.Redaksiyon örnekleri (yalnız REDACTED biçiminde)
apiKey/api_key/API_KEY/Api-KeyaccessToken/access_token/ACCESS_TOKENrefreshToken·authorization·bearer·jwtsecret·password·email·tokentokenCount·platform·detectedPlatform·vinMasked·latencyString değerlerde: ham VIN →
[VIN]· ham MAC →[MAC]· koordinat çifti →[COORD]·api_key=…→api_key=[MASKED]. Dairesel alan →[CYCLE]· okunamayan düğüm →[UNREADABLE].Testler — 21 kilit
src/__tests__/diagnosticSanitizeHardening.test.ts(yeni, 17 test):detail'indeki ham fetch hatası:api_key+ koordinat maskeleniyordetail'indeki stack karesi + VIN + MAC maskeleniyor, teşhis metni korunuyorworst/summary/env/results;MAX_ARRAY_LENkırpmıyor)apiKey/accessToken/authorization/… redakte;tokenCountkorunuyorAPI_KEY,Api-Key,ACCESS_TOKEN) düşüyorplatform/detectedPlatform/vinMasked/latencykorunuyor,latdüşüyor[CYCLE], kardeş alanlar akıyor[UNREADABLE], rapor gönderiliyorcodes[0]dolu · triyaj mevcut +OBD_DTC_PRESENT+ruleErrors=0· inspector timeline signals korunuyorregression.guards.test.ts(4 kaynak-metin kilidi,npm run guardkapsamı): selfTest ham atama yasağı + tek kapı · anahtar normalizasyonu (çıplaktoLowerCase()eşleşmesi yasak) + deny anahtarları · ancestor-path cycle guard (finally+delete) ·[UNREADABLE]fail-soft.PR-1'in dizi kilidi kaldırılmadı — yeni doğru davranışa güncellendi (dizi dalı
.map().filter()yerine döngüye geçti; davranış aynı:undefinedeleman diziye eklenmez).BEFORE koşumu kanıt: düzeltme yapılmadan aynı testler koşuldu → 8 kilit kırmızı (selfTest maskeleri, camelCase sızıntısı, cycle/
[UNREADABLE]işaretleri).CI
tsc -btemiz ·lint0 error ·buildOK · tam suite 3711 yeşil (206 dosya).🔴 Saha doğrulama — Ledger #63
Cihazda doğrulanmadı. Kabul ölçütü: gerçek cihazda "Tanı Robotu" (self-test) raporu gönderilmeli ve gövdesinde →
selfTest.results[].detailmevcut (bölüm boşalmadı) ·results.length= summary toplamı · hamError/fetch metninde VIN/MAC/koordinat/anahtar izi yok ·platformvevidMirror.vehicle.vinMaskedbölümleri hâlâ var (deny meşru alan düşürmedi) ·triagemevcut +ruleErrors=0· DTC varkencodes[0].codedolu ·[CYCLE]/[UNREADABLE]görünmüyor · gövdedetruncatedyok,octet_length < 45 KB· low-tier cihazda (K24/Mali-400 veya T507) gönderim başarılı, ANR yok.Gerçek cihazda self-test raporu görülmeden 🟢 yapılmayacak.
🤖 Generated with Claude Code
https://claude.ai/code/session_01Drs9NzKMErjeNT24wLnDxX