Avoimen lähdekoodin käyttöjärjestelmäjakelu OpenBSD on tunnettu järjestelmänvalvojien keskuudessa, erityisesti palvelimia hallinnoivien, keskittyessään turvallisuuteen nopeuden, ominaisuuksien ja hienojen käyttöliittymien yli.
Kenties sopivasti sen logo on pullikala – paisutettuna, ja sen piikit ovat valmiita karkottamaan mahdolliset ovelat hakkerit.
Mutta OpenBSD-tiimi ei todennäköisesti tunneta parhaiten koko distrostaan, vaan etäkäyttötyökalupaketista OpenSSH joka kirjoitettiin 1990-luvun lopulla sisällytettäväksi itse käyttöjärjestelmään.
SSH, lyhenne sanoista turvallinen kuori, on alun perin suomalaisen tietojenkäsittelytieteilijän luoma Tatu Ylönen 1990-luvun puolivälissä toivoen vieroittaakseen järjestelmänvalvojat riskialtis tapa käyttää Telnet-protokollaa.
Ongelma Telnetin kanssa
Telnet oli hämmästyttävän yksinkertainen ja tehokas: sen sijaan, että liitit fyysisiä johtoja (tai käyttäisit modeemia puhelinlinjan kautta) teletype-yhteyden muodostamiseksi etäpalvelimiin, käytit sen sijaan TELEtype NETwork -yhteyttä.
Pohjimmiltaan tiedot, jotka tavallisesti virtasivat edestakaisin erillisen sarjayhteyden tai puhelinlinjan kautta, lähetettiin ja vastaanotettiin Internetin kautta käyttämällä pakettikytkentäistä TCP-verkkoyhteyttä piirikytkentäisen point-to-point-linkin sijaan. .
Sama tuttu kirjautumisjärjestelmä, halvemmat yhteydet, ei tarvetta erillisille datalinjoille!
Telnetin jättimäinen puute oli tietysti sen täydellinen salauksen puute, joten tarkan pääte-istunnon haisteleminen oli triviaalia, jolloin krakkarit näkivät jokaisen kirjoittamasi komennon (jopa tekemäsi virheet ja kaikki osumakerrat). [Backspace]
), ja jokainen tuotettu tavu…
…ja tietysti käyttäjätunnuksesi ja salasanasi istunnon alussa.
Kuka tahansa verkkopolullasi ei vain pystynyt helposti rekonstruoimaan järjestelmänvalvojan istuntojasi reaaliajassa omalla näytöllään, vaan luultavasti myös peukaloida istuntoasi muuttamalla etäpalvelimelle lähettämiäsi komentoja ja teeskentelemällä vastaukset takaisin niin, että et huomannut. salaveto.
He voivat jopa perustaa huijaripalvelimen, houkutella sinut siihen ja tehdä petoksen havaitsemisesta yllättävän vaikeaksi.
Vahva FTW-salaus
Ylösen SSH:n tavoitteena oli lisätä vahva salaus- ja todennuskerros Telnet-tyyppisen istunnon kumpaankin päähän. turvallinen kuori (Sitä nimi tarkoittaa, jos olet koskaan miettinyt, vaikka melkein kaikki vain kutsuvat sitä ess-ess-aitch näinä päivinä).
Se oli välitön hitti, ja järjestelmänvalvojat omaksuivat protokollan nopeasti kaikkialla.
OpenSSH seurasi pian, kuten edellä mainittiin, ja se ilmestyi ensimmäisen kerran vuoden 1999 lopulla osana OpenBSD 2.6 vapauta.
OpenBSD-tiimi halusi luoda ilmaisen, luotettavan avoimen lähdekoodin toteutuksen protokollasta, jonka he ja kukaan muu voisi käyttää, ilman niitä lisenssejä tai kaupallisia komplikaatioita, jotka olivat rasittaneet Ylösen alkuperäistä toteutusta välittömästi sen julkaisun jälkeisinä vuosina.
Itse asiassa, jos käytät Windows SSH -palvelinta ja muodostat yhteyden siihen Linux-tietokoneelta juuri nyt, luotat melkein varmasti OpenSSH-toteutukseen molemmissa päissä.
SSH-protokollaa käytetään myös muissa suosituissa asiakaspalvelinpalveluissa, mukaan lukien SCP ja SFTP, lyhenne sanoista suojattu kopio ja suojattu FTP vastaavasti. SSH tarkoittaa löyhästi "Yhdistä turvallisesti ja suorita komentotulkki toisessa päässä", tyypillisesti interaktiivisille kirjautumisille, koska komentotulkin Unix-ohjelma on yleensä /bin/sh
. SCP on samanlainen, mutta tiedostojen kopiointia varten, koska Unix file-copy -komentoa kutsutaan yleensä /bin/cp
, ja SFTP on nimetty pitkälti samalla tavalla.
OpenSSH ei ole kaupungin ainoa SSH-työkalupakki.
Muita tunnettuja toteutuksia ovat: libssh2, kehittäjille, jotka haluavat rakentaa SSH-tuen suoraan omiin sovelluksiinsa; pisarakarhu, riisuttu SSH-palvelin australialaiselta kooderilta matt johnston joka löytyy laajalti niin kutsutuista IoT-laitteista, kuten kodin reitittimistä ja tulostimista; ja PuTTY, suosittu, ilmainen kokoelma SSH-työkaluja Windowsille avoimen lähdekoodin kehittäjältä Simon Tatham Englannissa.
Mutta jos olet tavallinen SSH-käyttäjä, olet melkein varmasti muodostanut yhteyden ainakin yhteen OpenSSH-palvelimeen tänään, ei vähiten siksi, että useimmat nykyaikaiset Linux-jakelut sisältävät sen tavallisena etäkäyttötyökalunaan, ja Microsoft tarjoaa sekä OpenSSH-asiakkaan että OpenSSH:n. palvelin virallisina Windows-komponentteina nykyään.
Tupla-ilmainen virheenkorjaus
OpenSSH versio 9.2 tuli juuri ulos, ja julkaisutiedot raportoi seuraavasti:
Tämä julkaisu sisältää korjauksia [...] muistin turvallisuusongelmaan. [Tämän bugin] ei uskota olevan hyödynnettävissä, mutta raportoimme useimmat verkkoon saavutettavissa olevat muistivirheet tietoturvavirheinä.
Vika vaikuttaa sshd
, OpenSSH-palvelin ( -d
suffiksi tarkoittaa demoni, Unix-nimi taustaprosessille, jota Windows kutsuu a palvelu):
sshd(8): Korjaa OpenSSH 9.1:ssä käyttöönotettu kaksinkertaisen vapaan muistin esitodennusvirhe. Tämän ei uskota olevan hyödynnettävissä, ja se tapahtuu etuoikeutetussa esitodennusprosessissa, joka on chrootin(2) alainen ja joka on edelleen hiekkalaatikolla useimmilla tärkeimmillä alustoilla.
Kaksoisvapaa bugi tarkoittaa, että muistilohko, jonka olet jo palauttanut käyttöjärjestelmään, voidaan käyttää uudelleen muissa ohjelman osissa…
…saa myöhemmin takaisin ohjelman osa, joka ei enää "omista" tuota muistia, mutta ei tiedä, ettei se omista.
(Tai luovutettu tahallisesti koodin kehotuksesta, joka yrittää provosoida virheen tarkoituksella kääntääkseen alttius osaksi hyödyntää.)
Tämä voi johtaa hienovaraisiin ja vaikeasti selvitettäviin virheisiin, varsinkin jos järjestelmä merkitsee vapautuneen lohkon käytettävissä olevaksi ensimmäisen kerran. free()
tapahtuu, varaa sen myöhemmin koodisi toiselle osalle, kun se pyytää muistia kautta malloc(
), ja merkitsee sitten lohkon jälleen vapaaksi, kun tarpeeton kutsu free()
näkyviin.
Tämä jättää sinut sellaiseen tilanteeseen, jonka koet, kun kirjaudut sisään hotelliin, jossa sanotaan: "Voi, hyviä uutisia! Luulimme, että olimme täynnä, mutta toinen vieras päätti vain kirjautua ulos aikaisin, jotta saat heidän huoneensa.
Vaikka huone on siististi siivottu ja valmisteltu uusille asukkaille tullessasi sisään ja näyttää siten siltä, että se oli oikein varattu yksinomaiseen käyttöön, sinun on silti luotettava siihen, että edellisen vieraan avainkortti todellakin peruutettiin oikein ja että heidän " aikainen kassalle” ei ollut ovela temppu hiipiä takaisin myöhemmin samana päivänä ja varastaa kannettavasi.
Virheenkorjaus virheenkorjaukseen
Ironista kyllä, jos katsot viimeaikaista OpenSSH-koodihistoriaa, huomaat, että OpenSSH:ssa oli vaatimaton bugi funktiossa nimeltä compat_kex_proposal()
, jota käytetään tarkistamaan, millaista avaimenvaihtoalgoritmia käytetään yhteyden muodostamisessa.
Mutta tämän vaatimattoman virheen korjaaminen toi sen sijaan vakavamman haavoittuvuuden.
Muuten, vian esiintyminen ohjelmiston osassa, jota käytetään yhteyden muodostamisen aikana, tekee tästä ns. verkkoon tavoitettavissa oleva esitodennus haavoittuvuus (tai todennusta edeltävä virhe lyhyesti).
Kaksoisvapaa virhe tapahtuu koodissa, joka on suoritettava jälkeen asiakas on aloittanut etäistunnon, mutta ennen avainsopimus tai todennus on tapahtunut, joten haavoittuvuus voidaan teoriassa laukaista ennen kuin salasanoja tai salausavaimia on esitetty tarkistettavaksi.
OpenSSH 9.0:ssa compat_kex_proposal
näytti suunnilleen tältä (paljon yksinkertaistettuna tässä):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
Ajatuksena on, että soittaja välittää oman muistilohkonsa, joka sisältää tekstimerkkijonon, joka ehdottaa avaimenvaihtoasetusta, ja saa takaisin joko hyväksynnän käyttää juuri lähettämäänsä ehdotusta tai äskettäin varatun tekstijonon päivitetyllä ehdotuksella. .
Virhe on, että jos ehto 1 on epätosi, mutta ehdot 2 ja 3 ovat molemmat tosi, koodi varaa kaksi uusia tekstijonoja, mutta vain palauttaa yksi.
Muistilohko, jonka on varannut allocatenewstring1()
ei koskaan vapaudu, ja kun funktio palaa, sen muistiosoite katoaa lopullisesti, joten koodilla ei ole mahdollisuutta free()
sitä tulevaisuudessa.
Tämä lohko on olennaisesti hylätty, mikä aiheuttaa ns muistivuoto.
Ajan mittaan tämä voi aiheuttaa ongelmia, ehkä jopa pakottaa palvelimen sulkeutumaan palautuakseen muistin ylikuormituksesta.
OpenSSH 9.1:ssä koodi päivitettiin, jotta vältytään kahden merkkijonon allokoinnista, mutta yhden niistä hylkäämisestä:
/* 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; }
Tässä on kaksoisvapaa virhe, koska jos ehto 1 ja ehto 2 ovat molemmat epätosi, mutta ehto 3 on tosi, koodi varaa uuden merkkijonon, joka lähetetään takaisin vastauksena…
…mutta vapauttaa virheellisesti soittajan alun perin välittämän merkkijonon, koska funktio allocatenewstring1()
sitä ei koskaan kutsuta päivittämään muuttujaa suggestion
.
Välitetty ehdotusmerkkijono on soittajalle kuuluva muisti, ja että soittaja vapauttaa siksi itseään myöhemmin, mikä johtaa kaksoisvapaaseen vaaraan.
OpenSSH 9.2:ssa koodista on tullut varovaisempi pitäen kirjaa kaikista kolmesta mahdollisesta käytetystä muistilohkosta: alkuperäinen suggestion
(jonkun muun omistama muisti) ja kaksi mahdollista uutta merkkijonoa, jotka saatetaan varata matkalla:
/* 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; }
Jos ehto 1 on tosi, siirretystä merkkijonosta käytetään uutta kopiota, jotta soittaja voi myöhemmin free()
heidän välitettyjen merkkijonojen muistiin milloin tahansa.
Jos ohitamme ehdon 1 ja ehto 2 on tosi, mutta ehto 3 on epätosi, niin vaihtoehtoinen ehdotus, jonka allocatenewstring1()
palautetaan ja luovutetaan suggestion
merkkijono jätetään yksin.
Jos ehto 2 on epätosi ja ehto 3 on tosi, uusi merkkijono luodaan ja palautetaan ja välitetty suggestion
merkkijono jätetään yksin.
Jos sekä ehto 2 että ehto 3 ovat tosia, matkan varrella varataan kaksi uutta merkkijonoa; ensimmäinen vapautuu, koska sitä ei tarvita; toinen palautetaan; ja sisäänsyötetyt suggestion
merkkijono jätetään yksin.
Sinä pystyt RTxM vahvistaaksesi sen, jos soitat free(newone)
kun newone
is NULL
, silloin "toimintoa ei suoriteta", koska se on aina turvallista free(NULL)
. Siitä huolimatta monet ohjelmoijat suojaavat sitä edelleen voimakkaasti koodilla, kuten if (ptr != NULL) { free(ptr); }
.
Mitä tehdä?
Kuten OpenSSH-tiimi ehdottaa, tämän bugin hyödyntäminen on vaikeaa, ei vähiten siksi, että sshd
ohjelmalla on, kun se muodostaa yhteyttä käyttöä varten.
Siitä huolimatta he ilmoittivat sen tietoturva-aukkona, koska se on sitä, joten varmista, että olet päivittänyt OpenSSH 9.2.
Ja jos kirjoitat koodia C-kielellä, muista, että riippumatta siitä, kuinka kokenut olet, muistinhallinta on helppo erehtyä...
… joten ole varovainen siellä.
(Kyllä, Rust ja sen nykyaikaiset ystävät tekevät auttaa sinua kirjoittamaan oikean koodin, mutta joskus joudut silti käyttämään C:tä, eikä edes Rust voi taata sitä älä kirjoita väärää koodia jos ohjelmoit harkitsemattomasti!)
- SEO-pohjainen sisällön ja PR-jakelu. Vahvista jo tänään.
- Platoblockchain. Web3 Metaverse Intelligence. Tietoa laajennettu. Pääsy tästä.
- Lähde: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/