TARTU ÜLIKOOL LOODUS- JA TÄPPISTEADUSTE VALDKOND ARVUTITEADUSE INSTITUUT Lauri Kongas Turvaauk CVE-2016-0778 Referaat aines Andmeturve MTAT.03.134 Õppejõud: Meelis Roos Tartu 2016
OpenSSH OpenSSH hõlmab erinevaid SSH protokollil baseeruvaid turvalisusega seotud teenuseid ja rakendusi. Nende alla kuulub ka OpenSSH klient ehk programm, mis SSH protokolli läbi võimaldab ühenduda kaugarvutiga. Roaming Alates versioonist 5.4 hakkas OpenSSH klient toetama roamingut. Roamingu idee seisneb selles, et kui kliendil kaob äkitselt roamingut toetava SSH serveriga ühendus, siis klient saab taasühendada serveriga ja jätkata peatatud sessiooni. Roaming tõi kaasa kaks turvaauku, mida on võimalik SSH serveril ära kasutada. Selles referaadis käsitlen puhvri ületäitumisega seotud turvaauku. Probleem Et mõista, millest probleem tekib, on hea saada mõningane ülevaade sellest, kuidas roaming OpenSSH klienti implementeeritud oli. Roamingu jaoks lisati klienti roaming_read() ja roaming_write() ehk kaks pakendmeetodit, mis kasutavad wait_for_roaming_reconnect() meetodit, et pärast ühenduse katkestust diskreetselt serveriga taasühenduda.
Ülaltoodud wait_for_roaming_reconnect() meetod koosneb sisuliselt neljast osast: 1. packet_backup_state() sulgeb connection_in ja connection_out ehk vanad file descriptorid, mis ühendasid klienti serveriga, ja salvestab peatatud SSH sessiooni. 2. ssh_connect() avab uued file descriptorid ja ühendab need SSH serveriga. 3. roaming_resume() suhtleb serveriga, et sessiooni jätkata ning kutsub välja meetodi resend_bytes(). 4. packet_restore_state() uuendab connection_in ja connection_out uute file descriptoritega ja taastab peatatud SSH sessiooni. Teatud juhtudel võivad uued file descriptorid olla erinevad vanadest. See võib juhtuda näiteks siis, kui kahe järjestikuse ssh_connect() väljakutse vahel avatakse või suletakse faile või sokleid. Probleem tekib, sest osa koodi eeldab, et antud file descriptorid ei muutu: - client_loop() meetodis puhverdatakse lokaalselt connection_in ja connection_out, aga meetod packet_write_poll() kutsub välja roaming_write(), mis võib connection_in ja connection_out väärtusi muuta. Samas client_wait_until_can_do_something() kasutab uuesti vanu, puhverdatud connection_in ja connection_out väärtusi. - client_loop() uuendab lõpuks puverdatud väärtused ja järgnev FD_ISSET() kasutab uut, uuendatud connection_out väärtust, aga vana file descriptorite hulka. - packet_read_seqnr() allokeerib setp (file descriptorite hulk) jaoks mälu, seejärel käib üle memset() ja FD_SET(), select() ja roaming_read() ning lõpuks vabastab setp all oleva mälu ja lõpetab töö. Siinkohal võib roaming_read() taasühendamise korral määrata connection_in väärtuse suuremaks kui see enne oli, aga setp mahtu ei suurendata. Selle tõttu võivad järgnevad memset() ja FD_SET() meetodid setp ületäita.
Sarnane olukord võib tekkida ka packet_write_wait() väljakutse puhul, nimelt võib see oma setp ületäita kui väljakutsutav roaming_write() muudab connection_out väärtuse suuremaks. Praktikas pole sellisel moel puhvri ületäitumine eriti eriti tõenäoline, sest selle esinemiseks peavad olema täidetud väga spetsiifilised tingimused ning kõigi eelduste kohaselt ei saa see toimuda OpenSSH kliendi vaikimisi seadetega. Selleks, et setp ületäita, oleks vaja connection_in ja connection_out suurendada sadade võrra. Selle juhtumiseks on vaja file descriptorite leket, mis omakorda on võimalik, kui kliendis on ForwardAgent (-A) või ForwardX11 (-X) lubatud. Pahatahtlik SSH server saab siis nõuda sadu forwardimisi, et iga korraga suurendada connection_in ja packet_read_seqnr() meetodis ületäita setp. Parandus Probleemi parandamiseks on kasutajal soovitatav uuendada OpenSSH kliendi versiooni, sest probleem esineb vaid versioonides 5.4 kuni 7.1. Versioon 7.1p2 keelab kliendis roamingu. Alternatiivselt saab roamingut keelata ka ise kui muuta süsteemi SSH konfiguratsioonifailis (tavaliselt /etc/ssh/ssh_config) või kasutaja SSH konfiguratsioonifailis (tavaliselt ~/.ssh/config) UseRoaming seade väärtuseks no. Näiteks saab seda teha käsuga # echo -e 'Host *\nuseroaming no' >> /etc/ssh/ssh_config
Kasutatud materjalid https://www.qualys.com/2016/01/14/cve-2016-0777-cve-2016-0778/openssh-cve-2016-0777-cve-2016-0778.txt https://en.wikipedia.org/wiki/openssh https://itservices.uchicago.edu/page/openssh-client-vulnerability-cve-2016-0777-and-cve- 2016-0778