Operativsystemdistributionen OpenBSD med öppen källkod är välkänd bland systemadministratörer, särskilt de som hanterar servrar, för sitt fokus på säkerhet framför hastighet, funktioner och snygga gränssnitt.
Passande nog är kanske dess logotyp en blåsfisk – uppblåst, med sina spikar redo att stöta bort alla listiga hackare som kan komma med.
Men OpenBSD-teamet är förmodligen inte mest känt för hela sin distro, utan för verktygslådan för fjärråtkomst OpenSSH som skrevs i slutet av 1990-talet för att inkluderas i själva operativsystemet.
SSH, förkortning av säkert skal, skapades ursprungligen av finländsk datavetare Tatu Ylönen i mitten av 1990-talet i hopp om att avvänja sysadmins från den riskabla vanan att använda Telnet-protokollet.
Problemet med Telnet
Telnet var anmärkningsvärt enkelt och effektivt: istället för att ansluta fysiska ledningar (eller använda ett modem över en telefonlinje) för att göra en teletypanslutning till fjärrservrar, använde du istället en TELetype NETwork-anslutning.
I grund och botten skickades och togs emot data som vanligtvis skulle flöda fram och tillbaka över en dedikerad seriell anslutning eller uppringd telefonlinje via internet, med hjälp av en paketkopplad TCP-nätverksanslutning istället för en kretskopplad punkt-till-punkt-länk .
Samma välbekanta inloggningssystem, billigare anslutningar, inget behov av dedikerade datalinjer!
Det gigantiska felet i Telnet var naturligtvis dess totala brist på kryptering, så att sniffa upp din exakta terminalsession var trivialt, vilket gjorde det möjligt för crackers att se varje kommando du skrev (även misstagen du gjorde och alla gånger du träffade [Backspace]
), och varje byte av utdata som produceras...
…och, naturligtvis, ditt användarnamn och lösenord i början av sessionen.
Vem som helst på din nätverksväg kunde inte bara enkelt rekonstruera dina sysadmin-sessioner i realtid på sin egen skärm, utan förmodligen också manipulera din session genom att ändra kommandona du skickade till fjärrservern och fejka att svaren kom tillbaka så att du inte märkte det. undanflykten.
De kan till och med sätta upp en bedragarserver, locka dig till den och göra det förvånansvärt svårt för dig att upptäcka bedrägeriet.
Stark kryptering FTW
Ylönens SSH syftade till att lägga till ett lager av stark kryptering och autentisering i varje ände av en Telnet-liknande session, vilket skapar en säkert skal (det är vad namnet står för, om du någonsin har undrat, även om nästan alla bara kallar det ess-ess-aitch dessa dagar).
Det blev en omedelbar hit, och protokollet antogs snabbt av systemadministratörer överallt.
OpenSSH följde snart, som vi nämnde ovan, och dök upp först i slutet av 1999 som en del av OpenBSD 2.6 släpp.
OpenBSD-teamet ville skapa en gratis, pålitlig implementering med öppen källkod av protokollet som de och någon annan kan använda, utan några av de licensiering eller kommersiella komplikationer som hade belastat Ylönens ursprungliga implementering under åren omedelbart efter dess utgivning.
Faktum är att om du kör Windows SSH-servern och ansluter till den från en Linux-dator just nu, kommer du nästan säkert att lita på OpenSSH-implementeringen i båda ändar.
SSH-protokollet används också i andra populära klient-servertjänster inklusive SCP och SFTP, förkortning för säker kopia och säker FTP respektive. SSH betyder löst, "anslut säkert och kör ett kommando-SHell i andra änden", vanligtvis för interaktiva inloggningar, eftersom Unix-programmet för ett kommandoskal vanligtvis är /bin/sh
. SCP är liknande, men för kopiering av filer, eftersom Unix-kommandot för filkopiering vanligtvis kallas /bin/cp
, och SFTP heter ungefär på samma sätt.
OpenSSH är inte den enda SSH-verktygslådan i stan.
Andra välkända implementeringar inkluderar: libssh2, för utvecklare som vill bygga SSH-stöd direkt i sina egna applikationer; dropbear, en avskalad SSH-server från australiensisk kodare matt johnston som finns allmänt på så kallade IoT-enheter (Internet of Things) som hemroutrar och skrivare; och PuTTY, en populär, gratis samling av SSH-relaterade verktyg för Windows från indie-utvecklare med öppen källkod Simon Tatham i England.
Men om du är en vanlig SSH-användare har du nästan säkert anslutit till minst en OpenSSH-server idag, inte minst för att de flesta moderna Linux-distributioner inkluderar den som standardverktyg för fjärråtkomst, och Microsoft erbjuder både en OpenSSH-klient och en OpenSSH server som officiella Windows-komponenter nu för tiden.
Dubbelfri buggfix
OpenSSH version 9.2 kom precis ut, och den släpp anteckningar rapportera enligt följande:
Den här utgåvan innehåller korrigeringar för […] ett minnessäkerhetsproblem. [Denna bugg] tros inte vara exploateringsbar, men vi rapporterar de flesta nätverksåtkomliga minnesfel som säkerhetsbuggar.
Felet påverkar sshd
, OpenSSH-servern (den -d
suffix står för daemon, Unix-namnet för den sorts bakgrundsprocess som Windows kallar en service):
sshd(8): fixa ett dubbelfritt minnesfel för förautentisering som introducerats i OpenSSH 9.1. Detta tros inte vara exploateringsbart, och det inträffar i den oprivilegierade pre-auth-processen som är föremål för chroot(2) och är ytterligare sandboxad på de flesta större plattformar.
En dubbelfri bugg innebär att ett minnesblock som du redan har återvänt till operativsystemet för att återanvändas i andra delar av ditt program...
…kommer senare att lämnas tillbaka igen av en del av programmet som inte längre faktiskt "äger" det minnet, men som inte vet att det inte gör det.
(Eller lämnas tillbaka avsiktligt vid uppmaning av kod som försöker provocera fram buggen med flit för att vända en sårbarhet till en exploatera.)
Detta kan leda till subtila och svårupptäckta buggar, särskilt om systemet markerar det frigjorda blocket som tillgängligt när den första free()
händer, tilldelar den senare till en annan del av din kod när den ber om minne via malloc(
), och markerar sedan blocket fritt igen när det överflödiga anropet till free()
visas.
Det lämnar dig i den typ av situation du upplever när du checkar in på ett hotell som säger: "Åh, goda nyheter! Vi trodde att vi var fulla, men en annan gäst bestämde sig precis för att checka ut tidigt, så att du kan få deras rum.”
Även om rummet är snyggt städat och förberett för nya passagerare när du går in, och därmed ser ut som om det var korrekt tilldelat för ditt exklusiva bruk, måste du fortfarande lita på att den tidigare gästens nyckelkort verkligen blev korrekt makulerat, och att deras " tidig utcheckning” var inte ett listigt knep att smyga tillbaka senare samma dag och stjäla din bärbara dator.
Bugfix för buggfix
Ironiskt nog, om du tittar på den senaste OpenSSH-kodhistoriken, ser du att OpenSSH hade en blygsam bugg i en funktion som heter compat_kex_proposal()
, används för att kontrollera vilken typ av nyckelutbytesalgoritm som ska användas när du ställer in en anslutning.
Men att fixa den blygsamma buggen introducerade istället en mer allvarlig sårbarhet.
Förresten, förekomsten av buggen i en del av programvaran som används under uppsättningen av en anslutning är det som gör detta till en s.k. nätverksnålig förautentisering sårbarhet (eller pre-auth bugg för korta).
Den dubbelfria buggen inträffar i kod som måste köras efter en klient har initierat en fjärrsession, men innan någon nyckelöverenskommelse eller autentisering har ägt rum, så sårbarheten kan i teorin utlösas innan några lösenord eller kryptografiska nycklar har presenterats för validering.
I OpenSSH 9.0, compat_kex_proposal
såg ut ungefär så här (väldigt förenklat här):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
Tanken är att den som ringer skickar in sitt eget minnesblock som innehåller en textsträng som föreslår en inställning för nyckelutbyte, och får tillbaka antingen ett godkännande att använda själva förslaget de skickade in, eller en nytilldelad textsträng med ett uppdaterat förslag .
Felet är att om villkor 1 är falskt men villkor 2 och 3 båda är sanna, allokeras koden två nya textsträngar, men returnerar bara ett.
Minnesblocket tilldelat av allocatenewstring1()
frigörs aldrig, och när funktionen kommer tillbaka är dess minnesadress förlorad för alltid, så det finns inget sätt för någon kod att free()
det i framtiden.
Det blocket är i huvudsak övergivet, vilket orsakar vad som kallas en minnesförlust.
Med tiden kan detta orsaka problem, kanske till och med tvinga servern att stängas av för att återhämta sig från minnesöverbelastning.
I OpenSSH 9.1 uppdaterades koden i ett försök att undvika att allokera två strängar men att överge en av dem:
/* 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; }
Detta har den dubbelfria buggen, för om villkor 1 och villkor 2 båda är falska, men villkor 3 är sant, tilldelar koden en ny sträng att skicka tillbaka som sitt svar...
…men frigör felaktigt strängen som anroparen ursprungligen skickade in, eftersom funktionen allocatenewstring1()
blir aldrig anropad för att uppdatera variabeln suggestion
.
Den inlämnade förslagssträngen är minne som tillhör den som ringer, och att uppringaren därför kommer att frigöra teman senare, vilket leder till den dubbelfria faran.
I OpenSSH 9.2 har koden blivit mer försiktig och håller reda på alla tre möjliga minnesblock som används: originalet suggestion
(minne som ägs av någon annan), och två möjliga nya strängar som kan tilldelas på vägen:
/* 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; }
Om villkor 1 är sant, används en ny kopia av den skickade strängen, så att den som ringer kan senare free()
deras inlämnade strängs minne när de vill.
Om vi kommer förbi villkor 1, och villkor 2 är sant men villkor 3 är falskt, då det alternativa förslaget skapat av allocatenewstring1()
återlämnas, och inlämningen suggestion
sträng lämnas ifred.
Om villkor 2 är falskt och villkor 3 är sant, genereras och returneras en ny sträng och skickas in suggestion
sträng lämnas ifred.
Om både villkor 2 och villkor 3 är sanna, tilldelas två nya strängar längs vägen; den första frigörs eftersom den inte behövs; den andra returneras; och det inpassade suggestion
sträng lämnas ifred.
Du kan RTxM för att bekräfta det om du ringer free(newone)
när newone
is NULL
, då "ingen operation utförs", eftersom det alltid är säkert att free(NULL)
. Ändå skyddar sig många programmerare mot det med kod som t.ex if (ptr != NULL) { free(ptr); }
.
Vad göra?
Som OpenSSH-teamet föreslår kommer det att bli svårt att utnyttja denna bugg, inte minst på grund av de begränsade privilegierna som sshd
programmet har medan det ställer in anslutningen för användning.
Ändå rapporterade de det som ett säkerhetshål eftersom det är vad det är, så se till att du har uppdaterat till OpenSSH 9.2.
Och om du skriver kod i C, kom ihåg att oavsett hur erfaren du är, är minneshantering lätt att få fel...
...så var försiktig där ute.
(Ja, Rust och dess moderna vänner kommer att göra det hjälpa dig att skriva rätt kod, men ibland kommer du fortfarande att behöva använda C, och även Rust kan inte garantera det stoppa dig att skriva felaktig kod om du programmerar omdömeslöst!)
- SEO-drivet innehåll och PR-distribution. Bli förstärkt idag.
- Platoblockchain. Web3 Metaverse Intelligence. Kunskap förstärkt. Tillgång här.
- Källa: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/
- 1
- 1999
- 9
- a
- ovan
- Absolut
- tillgång
- faktiskt
- adress
- antagen
- Efter
- mot
- algoritm
- Alla
- allokeras
- allokerar
- tillåta
- ensam
- redan
- alternativ
- Även
- alltid
- bland
- och
- Annan
- tillämpningar
- godkännande
- australier
- Autentisering
- Författaren
- bil
- tillgänglig
- undvika
- tillbaka
- bakgrund
- bakgrund-bild
- därför att
- blir
- innan
- tros
- BÄST
- Blockera
- Block
- gränsen
- Botten
- Bug
- fel
- SLUTRESULTAT
- Ring
- kallas
- Uppringare
- Samtal
- vilken
- Orsak
- orsakar
- försiktig
- Centrum
- säkerligen
- billigare
- ta
- klient
- koda
- kodare
- samling
- färg
- COM
- komma
- kommande
- kommersiella
- komponenter
- dator
- tillstånd
- villkor
- Bekräfta
- Kontakta
- anslutna
- Anslutning
- anslutning
- Anslutningar
- innehåller
- samtida
- kopiering
- kunde
- Naturligtvis
- täcka
- skapa
- skapas
- Skapa
- kryptografisk
- FARA
- datum
- dag
- Dagar
- beslutade
- dedicerad
- Utvecklare
- utvecklare
- enheter
- DID
- den
- svårt
- Visa
- fördelning
- Distributioner
- inte
- dubbelfri
- ner
- under
- varje
- Tidig
- lätt
- Effektiv
- antingen
- kryptering
- slutar
- England
- Hela
- speciellt
- väsentligen
- Även
- NÅGONSIN
- Varje
- alla
- Exklusiv
- erfarenhet
- erfaren
- bekant
- Funktioner
- Filer
- Förnamn
- Fisk
- Fast
- fel
- flöda
- Fokus
- följt
- följer
- alltid
- hittade
- Fri
- vänner
- från
- full
- fungera
- ytterligare
- framtida
- allmänhet
- genereras
- skaffa sig
- jätte
- Go
- god
- kraftigt
- garanti
- Guard
- Gäst
- hackare
- händer
- Hård
- höjd
- här.
- historia
- Träffa
- Hål
- Hem
- hoppas
- hotell
- hovring
- Hur ser din drömresa ut
- html
- HTTPS
- Tanken
- blir omedelbart
- genomförande
- in
- I andra
- innefattar
- Inklusive
- integration
- felaktigt
- Indien
- omedelbar
- istället
- interaktiva
- Internet
- sakernas Internet
- introducerade
- iot
- Iot (sakernas internet)
- IT
- sig
- hålla
- nycklar
- Vet
- känd
- Brist
- laptop
- Sent
- lager
- leda
- ledande
- Licens
- Begränsad
- linje
- LINK
- linux
- logotyp
- längre
- se
- såg
- UTSEENDE
- gjord
- större
- göra
- GÖR
- hantera
- ledning
- Marginal
- Materia
- max-bredd
- betyder
- Minne
- nämnts
- Microsoft
- kanske
- misstag
- Modern Konst
- mer
- mest
- namn
- Som heter
- Behöver
- behövs
- behov
- nät
- Icke desto mindre
- Nya
- normala
- Erbjudanden
- tjänsteman
- ONE
- öppet
- öppen källkod
- drift
- operativsystem
- drift
- beställa
- ursprungliga
- ursprungligen
- Övriga
- egen
- ägd
- del
- reservdelar till din klassiker
- Godkänd
- passerar
- Lösenord
- lösenord
- Tidigare
- bana
- paul
- kanske
- telefon
- fysisk
- Plats
- Plattformar
- plato
- Platon Data Intelligence
- PlatonData
- Populära
- placera
- möjlig
- inlägg
- beredd
- Närvaron
- presenteras
- föregående
- privilegier
- förmodligen
- Problem
- process
- Program
- programmerare
- ordentligt
- protokoll
- Syftet
- snabbt
- redo
- verklig
- realtid
- mottagna
- senaste
- Recover
- regelbunden
- frigöra
- pålitlig
- ihåg
- avlägsen
- fjärråtkomst
- rapport
- Rapporterad
- avkastning
- återgår
- Riskabel
- Rum
- Körning
- Rust
- säker
- Säkerhet
- Samma
- Forskare
- screen
- Andra
- säkert
- säkerhet
- seriell
- Tjänster
- session
- sessioner
- in
- inställning
- inställning
- svår
- Shell
- Kort
- stänga
- liknande
- Enkelt
- förenklade
- Situationen
- smyga
- So
- Mjukvara
- fast
- någon
- något
- Alldeles strax
- Källa
- fart
- spikar
- Spot
- standard
- står
- starta
- Fortfarande
- stark
- ämne
- sådana
- Föreslår
- stödja
- SVG
- system
- Ta
- grupp
- terminal
- Smakämnen
- Kvarteret
- deras
- Där.
- därför
- saker
- trodde
- tre
- tid
- gånger
- Titel
- till
- i dag
- verktyg
- toolkit
- verktyg
- topp
- Totalt
- spår
- övergång
- transparent
- triggas
- problem
- sann
- Litar
- SVÄNG
- typiskt
- unix
- Uppdatering
- uppdaterad
- URL
- användning
- Användare
- vanligen
- godkännande
- version
- via
- sårbarhet
- ville
- ALLBEKANT
- Vad
- medan
- VEM
- brett
- kommer
- fönster
- utan
- skulle
- skriva
- skrivning
- skriven
- år
- Din
- zephyrnet