Distribuția de sistem de operare open source OpenBSD este binecunoscută în rândul administratorilor de sistem, în special în rândul celor care gestionează servere, pentru concentrarea sa pe securitate peste viteză, funcții și front-end-uri luxoase.
În mod potrivit, poate, logo-ul său este un pește-puffer – umflat, cu vârfurile gata să respingă orice hackeri vicleni care ar putea veni.
Dar echipa OpenBSD este probabil cel mai bine cunoscută nu pentru întreaga sa distribuție, ci pentru setul de instrumente de acces la distanță OpenSSH care a fost scris la sfârșitul anilor 1990 pentru a fi inclus în sistemul de operare în sine.
SSH, prescurtare pentru cochilie sigură, a fost creat inițial de un informatician finlandez Tatu Ylönen la mijlocul anilor 1990, în speranța de a înțărca administratorii de sistem de la obiceiul riscant de a folosi protocolul Telnet.
Problema cu Telnet
Telnet a fost remarcabil de simplu și eficient: în loc să conectați fire fizice (sau să utilizați un modem pe o linie telefonică) pentru a realiza o conexiune de teletip la servere la distanță, ați folosit o conexiune TELetype NETwork.
Practic, datele care ar circula de obicei înainte și înapoi printr-o conexiune serială dedicată sau o linie telefonică dial-up au fost trimise și primite prin internet, folosind o conexiune de rețea TCP cu comutare de pachete în loc de o legătură punct la punct cu comutare de circuit. .
Același sistem de autentificare familiar, conexiuni mai ieftine, nu este nevoie de linii de date dedicate!
Defectul uriaș din Telnet, desigur, a fost lipsa totală de criptare, astfel încât adulmecarea sesiunii exacte de terminal a fost banală, permițând crackerilor să vadă fiecare comandă pe care ați tastat-o (chiar și greșelile pe care le-ați făcut și de fiecare dată când ați apăsat). [Backspace]
), și fiecare octet de ieșire produs...
…și, bineînțeles, numele de utilizator și parola la începutul sesiunii.
Oricine din calea dvs. de rețea ar putea nu numai să vă reconstruiască cu ușurință sesiunile de administrator de sistem în timp real pe propriul ecran, dar probabil să vă modifice sesiunea modificând comenzile pe care le-ați trimis la serverul de la distanță și falsând răspunsurile care revin astfel încât să nu observați. subterfugiul.
Ei ar putea chiar să înființeze un server impostor, să te ademenească la el și să-ți fie surprinzător de dificil să vezi înșelăciunea.
Criptare puternică FTW
SSH-ul lui Ylönen a urmărit să adauge un strat de criptare puternică și autentificare la fiecare capăt al unei sesiuni similare Telnet, creând un cochilie sigură (așa înseamnă numele, dacă te-ai întrebat vreodată, deși aproape toată lumea îl numește es-ess-aitch aceste zile).
A fost o lovitură instantanee, iar protocolul a fost adoptat rapid de administratorii de sistem de pretutindeni.
OpenSSH a urmat curând, după cum am menționat mai sus, apărând pentru prima dată la sfârșitul anului 1999, ca parte a OpenBSD 2.6 eliberare.
Echipa OpenBSD a dorit să creeze o implementare gratuită, de încredere, open-source a protocolului pe care ei și oricine altcineva ar putea folosi, fără niciuna dintre complicațiile de licențiere sau comerciale care au împiedicat implementarea inițială a lui Ylönen în anii imediat după lansare.
Într-adevăr, dacă rulați serverul Windows SSH și vă conectați la el de pe un computer Linux chiar acum, aproape sigur vă veți baza pe implementarea OpenSSH la ambele capete.
Protocolul SSH este folosit și în alte servicii client-server populare, inclusiv SCP și SFTP, prescurtare pentru copie securizată și FTP securizat respectiv. SSH înseamnă, în mod vag, „conectați în siguranță și rulați un shell de comandă la celălalt capăt”, de obicei pentru autentificări interactive, deoarece programul Unix pentru un shell de comandă este de obicei /bin/sh
. SCP este similar, dar pentru Copierea fișierelor, deoarece comanda Unix de copiere a fișierelor este în general numită /bin/cp
, iar SFTP este numit aproape în același mod.
OpenSSH nu este singurul set de instrumente SSH din oraș.
Alte implementări binecunoscute includ: libssh2, pentru dezvoltatorii care doresc să construiască suport SSH chiar în propriile aplicații; dropbear, un server SSH redus de la un codificator australian mat johnston care se găsește pe scară largă pe așa-numitele dispozitive IoT (Internet of Things), cum ar fi routerele și imprimantele de acasă; și PuTTY, o colecție populară și gratuită de instrumente legate de SSH pentru Windows de la un dezvoltator independent open-source Simon Tatham în Anglia.
Dar dacă sunteți un utilizator SSH obișnuit, aproape sigur v-ați conectat la cel puțin un server OpenSSH astăzi, nu în ultimul rând pentru că majoritatea distribuțiilor Linux contemporane îl includ ca instrument standard de acces la distanță, iar Microsoft oferă atât un client OpenSSH, cât și un OpenSSH. server ca componente oficiale Windows în zilele noastre.
Remediere dublă gratuită a erorilor
OpenSSH versiunea 9.2 tocmai a ieșit, și Note de lansare raportați după cum urmează:
Această versiune conține remedieri pentru […] o problemă de siguranță a memoriei. [Acest bug] nu se crede a fi exploatabil, dar raportăm majoritatea erorilor de memorie accesibile în rețea ca erori de securitate.
Bug-ul afectează sshd
, serverul OpenSSH ( -d
sufixul reprezintă daemon, numele Unix pentru tipul de proces de fundal pe care Windows îl numește a serviciu):
sshd(8): remediați o eroare de memorie dublă liberă de pre-autentificare introdusă în OpenSSH 9.1. Se crede că acest lucru nu poate fi exploatat și are loc în procesul de pre-auth neprivilegiat care este supus chroot(2) și este în continuare sandbox pe majoritatea platformelor majore.
O eroare dublu-liberă înseamnă că un bloc de memorie pe care l-ați returnat deja la sistemul de operare pentru a fi reutilizat în alte părți ale programului dvs....
… mai târziu va fi returnat din nou de o parte a programului care nu mai „deține” memoria respectivă, dar nu știe că nu o are.
(Sau returnat în mod deliberat la solicitarea unui cod care încearcă să provoace eroarea intenționată pentru a transforma un vulnerabilitate într-un exploata.)
Acest lucru poate duce la erori subtile și greu de dezlegat, mai ales dacă sistemul marchează blocul eliberat ca fiind disponibil la primul free()
se întâmplă, mai târziu îl alocă unei alte părți a codului dvs. când solicită memorie prin malloc(
), și apoi marchează blocul liber încă o dată când apelul de prisos la free()
apare.
Asta te lasă în genul de situație pe care o trăiești atunci când te cazezi într-un hotel care spune: „Oh, vești bune! Am crezut că suntem plini, dar un alt oaspete tocmai a decis să plece mai devreme, astfel încât să poți avea camera lui.”
Chiar dacă camera este curățată și pregătită pentru noii ocupanți atunci când intri și, astfel, pare că a fost alocată în mod corespunzător pentru uzul tău exclusiv, trebuie să ai încredere că cardul de cheie al oaspetelui anterior a fost într-adevăr anulat corect și că „ checkout devreme” nu a fost un șiretlic pentru a vă strecura înapoi mai târziu în aceeași zi și a vă fura laptopul.
Remediere erori pentru remedierea erorilor
În mod ironic, dacă te uiți la istoricul recent al codului OpenSSH, vei vedea că OpenSSH a avut o eroare modestă într-o funcție numită compat_kex_proposal()
, folosit pentru a verifica ce fel de algoritm de schimb de chei să folosești la configurarea unei conexiuni.
Dar remedierea acestei erori modeste a introdus în schimb o vulnerabilitate mai gravă.
Apropo, prezența erorii într-o parte a software-ului care este utilizată în timpul configurării unei conexiuni este ceea ce face ca aceasta să fie așa-numită pre-autentificare accesibilă în rețea vulnerabilitate (sau eroare de pre-auth pe scurt).
Bug-ul dublu gratuit apare în codul care trebuie să ruleze după un client a inițiat o sesiune la distanță, dar înainte a avut loc orice acord de cheie sau autentificare, astfel încât vulnerabilitatea poate fi, teoretic, declanșată înainte ca orice parole sau chei criptografice să fi fost prezentate pentru validare.
În OpenSSH 9.0, compat_kex_proposal
arăta cam așa (foarte simplificat aici):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
Ideea este că apelantul trece în propriul bloc de memorie care conține un șir de text care sugerează o setare de schimb de chei și primește fie o aprobare pentru a utiliza chiar sugestia pe care a trimis-o, fie un șir de text nou alocat cu o sugestie actualizată. .
Eroare este că, dacă condiția 1 este falsă, dar condițiile 2 și 3 sunt ambele adevărate, codul se alocă Două șiruri de text noi, dar numai returnează unu.
Blocul de memorie alocat de allocatenewstring1()
nu este niciodată eliberată, iar când funcția revine, adresa sa de memorie este pierdută pentru totdeauna, deci nu există nicio modalitate de a vreun cod free()
acesta în viitor.
Acest bloc este în esență abandonat, provocând ceea ce este cunoscut sub numele de a pierdere de memorie.
În timp, acest lucru ar putea cauza probleme, poate chiar forțând serverul să se închidă pentru a se recupera de la supraîncărcarea memoriei.
În OpenSSH 9.1, codul a fost actualizat în încercarea de a evita alocarea a două șiruri, dar abandonarea unuia dintre ele:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion){ char* previousone = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { previousone = suggestion; suggestion = allocatenewstring2(); } free(previousone); } if (isblank(suggestion()) { error(); } return suggestion; }
Aceasta are eroarea dublu-liberă, deoarece dacă condiția 1 și condiția 2 sunt ambele false, dar condiția 3 este adevărată, atunci codul alocă un șir nou pentru a-l trimite înapoi ca răspuns...
…dar eliberează incorect șirul pe care l-a transmis inițial apelantul, deoarece funcția allocatenewstring1()
nu este apelat niciodată pentru a actualiza variabila suggestion
.
Șirul de sugestii transmis este memoria care aparține apelantului, și că, prin urmare, apelantul își va elibera temele mai târziu, ceea ce duce la pericolul dublu liber.
În OpenSSH 9.2, codul a devenit mai prudent, ținând evidența tuturor celor trei blocuri de memorie posibile utilizate: originalul suggestion
(memorie deținută de altcineva) și două posibile șiruri noi care ar putea fi alocate pe parcurs:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion) { char* newone = NULL; char* newtwo = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { newone = allocatenewstring1(); } if (condition3) { newtwo = allocatenewstring2(); } free(newone); newone = newtwo; } if (isblank(newone)) { error(); } return newone; }
Dacă condiția 1 este adevărată, se folosește o nouă copie a șirului transmis, astfel încât apelantul să poată mai târziu free()
amintirea șirului lor transmis oricând doresc.
Dacă obținem condiția trecută 1 și condiția 2 este adevărată, dar condiția 3 este falsă, atunci sugestia alternativă creată de allocatenewstring1()
este returnat, iar cel trecut suggestion
sfoară este lăsată în pace.
Dacă condiția 2 este falsă și condiția 3 este adevărată, atunci un șir nou este generat și returnat, iar transferul suggestion
sfoară este lăsată în pace.
Dacă atât condiția 2, cât și condiția 3 sunt adevărate, atunci două șiruri noi sunt alocate pe parcurs; primul se eliberează pentru că nu este nevoie; al doilea este returnat; iar cel trecut suggestion
sfoară este lăsată în pace.
Poti RTxM pentru a confirma că dacă suni free(newone)
cand newone
is NULL
, apoi „nu se efectuează nicio operațiune”, pentru că este întotdeauna sigur free(NULL)
. Cu toate acestea, o mulțime de programatori încă se protejează puternic împotriva lui cu cod cum ar fi if (ptr != NULL) { free(ptr); }
.
Ce să fac?
După cum sugerează echipa OpenSSH, exploatarea acestui bug va fi dificilă, nu în ultimul rând din cauza privilegiilor limitate pe care sshd
programul are în timp ce configurează conexiunea pentru utilizare.
Cu toate acestea, au raportat-o ca o gaură de securitate, deoarece asta este, așa că asigurați-vă că ați actualizat la OpenSSH 9.2.
Și dacă scrieți cod în C, amintiți-vă că, oricât de experiență aveți, gestionarea memoriei este ușor de greșit...
…deci ai grijă acolo.
(Da, Rust și prietenii săi moderni o vor face vă ajută să scrieți codul corect, dar uneori va trebui totuși să utilizați C și nici măcar Rust nu poate garanta nu mai scrii cod incorect dacă programezi nedrept!)
- Distribuție de conținut bazat pe SEO și PR. Amplifică-te astăzi.
- Platoblockchain. Web3 Metaverse Intelligence. Cunoștințe amplificate. Accesați Aici.
- Sursa: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/
- 1
- 1999
- 9
- a
- mai sus
- Absolut
- acces
- de fapt
- adresa
- adoptată
- După
- împotriva
- Algoritmul
- TOATE
- alocate
- alocari
- Permiterea
- singur
- deja
- alternativă
- Cu toate ca
- mereu
- între
- și
- O alta
- aplicatii
- aprobare
- australian
- Autentificare
- autor
- Auto
- disponibil
- evita
- înapoi
- fundal
- imagine de fundal
- deoarece
- deveni
- înainte
- credea
- CEL MAI BUN
- Bloca
- Blocuri
- frontieră
- De jos
- Bug
- gandaci
- construi
- apel
- denumit
- apelant
- apeluri
- pasă
- Provoca
- provocând
- precaut
- Centru
- cu siguranță
- mai ieftin
- verifica
- client
- cod
- codator
- colectare
- culoare
- COM
- cum
- venire
- comercial
- componente
- calculator
- condiție
- Condiții
- Confirma
- Conectați
- legat
- Conectarea
- conexiune
- Conexiuni
- conține
- contemporan
- copiere
- ar putea
- înscrie-te la cursul
- acoperi
- crea
- a creat
- Crearea
- criptografic
- PERICOL
- de date
- zi
- Zi
- hotărât
- dedicat
- Dezvoltator
- Dezvoltatorii
- Dispozitive
- FĂCUT
- .
- dificil
- Afişa
- distribuire
- distribuții
- Nu
- dublu liber
- jos
- în timpul
- fiecare
- Devreme
- cu ușurință
- Eficace
- oricare
- criptare
- se încheie
- Anglia
- Întreg
- mai ales
- În esență,
- Chiar
- EVER
- Fiecare
- toată lumea
- Exclusiv
- experienţă
- cu experienţă
- familiar
- DESCRIERE
- Fişiere
- First
- Peşte
- Repara
- defect
- debit
- Concentra
- a urmat
- urmează
- pentru totdeauna
- găsit
- Gratuit
- Prietenii lui
- din
- Complet
- funcţie
- mai mult
- viitor
- în general
- generată
- obține
- gigant
- Go
- bine
- foarte mult
- garanta
- Pază
- Oaspete
- hackeri
- se întâmplă
- Greu
- înălțime
- aici
- istorie
- Lovit
- Gaură
- Acasă
- speranţă
- hotel
- planare
- Cum
- HTML
- HTTPS
- idee
- imediat
- implementarea
- in
- În altele
- include
- Inclusiv
- includere
- în mod incorect
- India
- clipă
- in schimb
- interactiv
- Internet
- internetul Lucrurilor
- introdus
- IoT
- Iot (Internetul lucrurilor)
- IT
- în sine
- păstrare
- chei
- Cunoaște
- cunoscut
- lipsă
- laptop
- Târziu
- strat
- conduce
- conducere
- de licențiere
- Limitat
- Linie
- LINK
- linux
- siglă
- mai lung
- Uite
- uitat
- Se pare
- făcut
- major
- face
- FACE
- administra
- administrare
- Margine
- materie
- max-width
- mijloace
- Memorie
- menționat
- Microsoft
- ar putea
- greşeli
- Modern
- mai mult
- cele mai multe
- nume
- Numit
- Nevoie
- necesar
- nevoilor
- reţea
- cu toate acestea
- Nou
- normală.
- promoții
- oficial
- ONE
- deschide
- open-source
- de operare
- sistem de operare
- operaţie
- comandă
- original
- iniţial
- Altele
- propriu
- deţinute
- parte
- piese
- Trecut
- trece
- Parolă
- Parolele
- trecut
- cale
- Paul
- poate
- telefon
- fizic
- Loc
- Platforme
- Plato
- Informații despre date Platon
- PlatoData
- Popular
- poziţie
- posibil
- postări
- pregătit
- prezenţă
- prezentat
- precedent
- privilegii
- probabil
- Problemă
- proces
- Program
- Programatorii
- cum se cuvine
- protocol
- scop
- repede
- gata
- real
- în timp real
- primit
- recent
- Recupera
- regulat
- eliberaţi
- de încredere
- minte
- la distanta
- acces de la distanță
- raportează
- Raportat
- reveni
- Returnează
- Riscant
- Cameră
- Alerga
- Rugină
- sigur
- Siguranţă
- acelaşi
- Om de stiinta
- Ecran
- Al doilea
- în siguranță,
- securitate
- de serie
- Servicii
- sesiune
- Sesiunile
- set
- instalare
- configurarea
- sever
- Coajă
- Pantaloni scurți
- Închide
- asemănător
- simplu
- simplificată
- situație
- furişa
- So
- Software
- solid
- Cineva
- ceva
- Curând
- Sursă
- viteză
- piroane
- Loc
- standard
- Standuri
- Începe
- Încă
- puternic
- subiect
- astfel de
- sugerează
- a sustine
- SVG
- sistem
- Lua
- echipă
- Terminal
- Blocul
- lor
- Acolo.
- prin urmare
- lucruri
- gândit
- trei
- timp
- ori
- Titlu
- la
- astăzi
- instrument
- Toolkit
- Unelte
- top
- Total
- urmări
- tranziţie
- transparent
- a declanșat
- necaz
- adevărat
- Încredere
- ÎNTORCĂ
- tipic
- unix
- Actualizează
- actualizat
- URL-ul
- utilizare
- Utilizator
- obișnuit
- validare
- versiune
- de
- vulnerabilitate
- dorit
- bine cunoscut
- Ce
- în timp ce
- OMS
- pe larg
- voi
- ferestre
- fără
- ar
- scrie
- scris
- scris
- ani
- Ta
- zephyrnet