Začleněno do upstreamu 7. 10. 2026 Oprava chyby v ProFTPD v upstreamu
ProFTPD: odpovědi keyboard-interactive přiřazené ke špatným výzvám PAM
Náš skener upozornil, že modul mod_sftp_pam serveru ProFTPD, přes který se přihlášení k SFTP ověřuje pomocí PAM a metody keyboard-interactive, četl odpovědi klienta podle špatného indexu. Když modul PAM poslal ve stejné konverzaci před výzvou informační zprávu, výzva dostala špatnou odpověď a kód četl za koncem pole odpovědí. Správce TJ Saunders naši opravu 7. října 2026 začlenil.
Co bylo špatně
sftppam_converse() posílá klientovi jako výzvy keyboard-interactive jen výzvy PAM (PAM_PROMPT_ECHO_ON a PAM_PROMPT_ECHO_OFF). Informační a chybové zprávy (PAM_TEXT_INFO, PAM_ERROR_MSG) se místo toho zobrazí jako banner nebo zalogují. ProFTPD vyžaduje na každou výzvu právě jednu odpověď, takže klient vrátí jednu odpověď na výzvu.
Smyčka, která odpovědi předává zpět do PAM, je ale indexovala pozicí zprávy PAM, ne pozicí výzvy. Při zprávách [PAM_TEXT_INFO, PAM_PROMPT_ECHO_OFF] se pošle jen jedna výzva, kód však přečetl recvd_responses[1] a předal ho do strdup(): čtení mimo alokovanou paměť na haldě.
Moduly PAM to dělat smějí. Například pam-krb5 posílá při změně prošlého hesla banner Kerberosu jako PAM_TEXT_INFO spolu s výzvami. S takovou konfigurací PAM přihlášení přes keyboard-interactive selhalo, nebo mohl spadnout proces relace. Klient sám to vyvolat nemůže; záleží na konfiguraci PAM na serveru.
Jak to bylo opraveno
Oprava drží pro přijaté odpovědi samostatný index a posouvá ho jen u výzev, takže nikdy nepřekročí počet přijatých odpovědí:
- uint32_t recvd_count = 0;
+ uint32_t recvd_count = 0, recvd_idx = 0;
...
case PAM_PROMPT_ECHO_OFF:
- res[i].resp = strdup(recvd_responses[i]);
+ res[i].resp = strdup(recvd_responses[recvd_idx++]);
Moduly v contrib ProFTPD nemají harness pro jednotkové testy, takže jsme změnu ověřili samostatným harnessem s AddressSanitizerem kolem konverzační funkce. Tři smíšené seznamy zpráv, které před opravou vedly k čtení mimo hranice haldy, po ní projdou. Správce TJ Saunders (Castaglia) v pull requestu odpověděl:
„I'll be merging this shortly. Thanks for the patch/fix!“
Časová osa
- 30. 9. 2026. Sken zdrojového stromu ProFTPD (411 souborů, model qwen3.8-27b) upozornil na
sftppam_converse(). Tři kola triáže nález vyhodnotila jako platný. - 2. 10. Záměnu indexů jsme potvrdili harnessem s AddressSanitizerem a otevřeli pull request #2355.
- 7. 10. TJ Saunders ho začlenil do masteru. K 9. 10. 2026 zatím není v žádném vydání.
Jak to číst
Skener ukázal na správnou funkci, ale jeho triáž přecenila dosah: předpokládala, že klient může poslat méně odpovědí než výzev. Čtení přijímacího kódu to vyloučilo a zúžilo problém na konfigurace PAM, které míchají zprávy a výzvy. Právě tenhle užší popis šel do upstreamu. Nálezy jsou podněty pro lidi, ne rozsudky.