Opraveno v upstreamu 23. 10. 2026 Oprava chyby v upstreamu Orca
Orca: čtení SSH identity souboru mohlo zmrazit aplikaci
Náš skener upozornil, že Orca, desktopová aplikace pro práci s celou flotilou kódovacích agentů, četla soukromé SSH klíče bez kontroly typu a velikosti souboru. Založili jsme issue a pull request s opravou a testy. Správce Neil (nwparker) na nich druhý den postavil širší opravu, ponechal naše testovací případy a uvedl nás jako spoluautora commitu.
Co bylo špatně
Pro připojení ke vzdáleným strojům Orca zjišťuje cesty IdentityFile z uživatelovy SSH konfigurace a klíče čte v src/main/ssh/ssh-auth-resolution.ts. readPrivateKey() a findDefaultKeyFile() na cestě rovnou volaly readFileSync():
- Pokud cesta vedla na pojmenovanou rouru (FIFO) nebo zařízení, synchronní čtení zablokovalo hlavní proces Electronu a aplikace zamrzla.
- Pokud omylem vedla na velký soubor, třeba obraz disku nebo log, načetl se celý do paměti dřív, než parsování klíče vůbec začalo.
Cesty pocházejí z uživatelovy vlastní konfigurace, takže nejde o bezpečnostní hranici, kterou by překračoval cizí útočník. Je to problém robustnosti: jediný zvláštní nebo překlepnutý řádek IdentityFile mohl zaseknout celou aplikaci. Na jiných místech kód velikost souborů už omezoval, například WORKTREE_INCLUDE_MAX_FILE_BYTES, tady ale ne.
Jak to bylo opraveno
Náš pull request přidal před obě čtení kontrolu statSync(): číst se smí jen běžný soubor do 256 KB. Testy pokrývaly adresář a příliš velký klíč, a to pro výchozí i explicitně zadané cesty.
Správce vydal širší verzi v pull requestu #32274. Každé místo, kde Orca čte SSH klíč nebo identity soubor, teď prochází jednou čtečkou ssh-identity-file-read.ts. Ta přijímá jen běžné soubory (i přes symlinky), otevírá je neblokujícím způsobem, takže ani cesta podvržená za rouru až po kontrole nic nezablokuje, používá stávající limit 1 MB pro identity soubory a pokrývá i čtení .pub u IdentitiesOnly. Neúspěšné přihlášení teď řekne, který soubor s klíčem byl přeskočen a proč:
// Why one reader: identity paths come from user config, so a FIFO or device must never block the
// main process and an oversized file must never be loaded whole.
export function readSshIdentityFileSync(filePath: string): SshIdentityFileRead {
try {
return {
contents: readNodeFileSyncWithinLimit(filePath, MAX_SSH_IDENTITY_FILE_BYTES, READ_OPTIONS)
.buffer
}
} catch (error) {
return { contents: null, problem: describeIdentityFileProblem(error) }
}
}
Neil (nwparker) pod náš pull request napsal:
“Thanks a lot for finding this, @Huge, and for the clear write-up and fix.”
Časová osa
- Říjen 2026. Sken stromu Orca upozornil na neomezené
readFileSync()na cestě ke klíči; triáž nález potvrdila jako problém robustnosti, ne zranitelnost. - 22. 10. Založili jsme issue #31965 a otevřeli pull request #31966 s opravou a testy.
- 23. 10. Správce začlenil #32274, který na našem pull requestu staví, jako commit 699c17c s námi jako spoluautorem, a náš pull request ve prospěch svého zavřel. K 23. 10. 2026 oprava ještě není v žádném vydání; poslední je v1.4.237.
Jak to číst
První popis skeneru mluvil o cestě, kterou „volí útočník“. Čtení kódu ukázalo, že cesta pochází z uživatelovy vlastní SSH konfigurace, a tak jsme to nahlásili jen jako opravu robustnosti. Správce pak šel dál než náš patch: uzavřel souběh mezi kontrolou a čtením a ošetřil i čtení .pub, které jsme přehlédli. Nálezy jsou podněty pro lidi, ne rozsudky.