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():

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

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.

Zdroje

← Zpět na příběhy úspěchu