De open source besturingssysteemdistributie OpenBSD is bekend onder systeembeheerders, vooral degenen die servers beheren, vanwege de focus op beveiliging boven snelheid, functies en fraaie front-ends.
Het is misschien passend dat het logo een kogelvis is - opgeblazen, met zijn stekels klaar om eventuele sluwe hackers af te weren.
Maar het OpenBSD-team is waarschijnlijk niet het best bekend om zijn volledige distro, maar om de toolkit voor externe toegang OpenSSH dat eind jaren negentig is geschreven voor opname in het besturingssysteem zelf.
SSH, afkorting van veilige shell, is oorspronkelijk gemaakt door de Finse computerwetenschapper Tatu Ylonen halverwege de jaren negentig in de hoop systeembeheerders te ontwennen aan de riskante gewoonte om het Telnet-protocol te gebruiken.
Het probleem met Telnet
Telnet was opmerkelijk eenvoudig en effectief: in plaats van fysieke draden aan te sluiten (of een modem over een telefoonlijn te gebruiken) om een teletype-verbinding met externe servers te maken, gebruikte je in plaats daarvan een TELetype NETwork-verbinding.
Kortom, de gegevens die gewoonlijk heen en weer zouden stromen via een speciale seriële verbinding of inbeltelefoonlijn, werden verzonden en ontvangen via internet, met behulp van een pakketgeschakelde TCP-netwerkverbinding in plaats van een circuitgeschakelde point-to-point-verbinding .
Hetzelfde vertrouwde inlogsysteem, goedkopere verbindingen, geen speciale datalijnen nodig!
De gigantische fout in Telnet was natuurlijk het totale gebrek aan codering, zodat het opsporen van je exacte terminalsessie triviaal was, waardoor crackers elk commando konden zien dat je typte (zelfs de fouten die je maakte en alle keren dat je op [Backspace]
), en elke geproduceerde byte uitvoer...
…en natuurlijk uw gebruikersnaam en wachtwoord bij aanvang van de sessie.
Iedereen op uw netwerkpad kan niet alleen eenvoudig uw sysadmin-sessies in realtime op hun eigen scherm reconstrueren, maar waarschijnlijk ook met uw sessie knoeien door de opdrachten die u naar de externe server hebt gestuurd te wijzigen en te doen alsof de antwoorden terugkomen, zodat u het niet merkt de uitvlucht.
Ze kunnen zelfs een bedriegerserver opzetten, je ernaartoe lokken en het verrassend moeilijk voor je maken om het bedrog te herkennen.
Sterke encryptie FTW
Ylönen's SSH was bedoeld om een laag van sterke codering en authenticatie toe te voegen aan elk uiteinde van een Telnet-achtige sessie, waardoor een veilige shell (daar staat de naam voor, als je je dat ooit hebt afgevraagd, hoewel bijna iedereen het gewoon noemt ess-ess-aitch de laatste tijd).
Het was meteen een hit en het protocol werd overal snel overgenomen door systeembeheerders.
OpenSSH volgde al snel, zoals we hierboven vermeldden, en verscheen voor het eerst eind 1999 als onderdeel van de OpenBSD 2.6 vrij.
Het OpenBSD-team wilde een gratis, betrouwbare, open-source-implementatie creëren van het protocol dat zij en iemand anders zou kunnen gebruiken, zonder de licentie- of commerciële complicaties die de oorspronkelijke implementatie van Ylönen in de jaren onmiddellijk na de release hadden gehinderd.
Als je de Windows SSH-server draait en er nu verbinding mee maakt vanaf een Linux-computer, vertrouw je vrijwel zeker op de OpenSSH-implementatie aan beide kanten.
Het SSH-protocol wordt ook gebruikt in andere populaire client-serverservices, waaronder SCP en SFTP, een afkorting van beveiligde kopie en veilige ftp respectievelijk. SSH betekent losjes "verbind veilig en voer een opdracht SHell uit aan de andere kant", typisch voor interactieve aanmeldingen, omdat het Unix-programma voor een opdrachtshell meestal /bin/sh
. SCP is vergelijkbaar, maar voor het kopiëren van bestanden, omdat het Unix-commando voor het kopiëren van bestanden over het algemeen wordt genoemd /bin/cp
, en SFTP wordt op vrijwel dezelfde manier genoemd.
OpenSSH is niet de enige SSH-toolkit in de stad.
Andere bekende implementaties zijn onder meer: libssh2, voor ontwikkelaars die SSH-ondersteuning rechtstreeks in hun eigen applicaties willen inbouwen; dropbear, een uitgeklede SSH-server van de Australische coder mat johnston dat wordt veel aangetroffen op zogenaamde IoT-apparaten (Internet of Things), zoals thuisrouters en printers; En PuTTY, een populaire, gratis verzameling SSH-gerelateerde tools voor Windows van indie open-source ontwikkelaar Simon Tatham in Engeland.
Maar als je een gewone SSH-gebruiker bent, heb je vandaag vrijwel zeker verbinding gemaakt met ten minste één OpenSSH-server, niet in de laatste plaats omdat de meeste hedendaagse Linux-distributies het als hun standaardtool voor externe toegang bevatten, en Microsoft biedt zowel een OpenSSH-client als een OpenSSH server tegenwoordig als officiële Windows-componenten.
Dubbel gratis bugfix
OpenSSH-versie 9.2 kwam net uit, en de release notes rapporteer als volgt:
Deze release bevat oplossingen voor […] een geheugenveiligheidsprobleem. Aangenomen wordt dat [deze bug] niet kan worden misbruikt, maar we rapporteren de meeste netwerkbereikbare geheugenfouten als beveiligingsbugs.
De bug beïnvloedt sshd
, de OpenSSH-server (de -d
achtervoegsel staat voor demon, de Unix-naam voor het soort achtergrondproces dat Windows een service):
ssd(8): repareer een pre-authenticatie dubbel-vrije geheugenfout geïntroduceerd in OpenSSH 9.1. Aangenomen wordt dat dit niet misbruikt kan worden en het gebeurt in het onbevoegde pre-authenticatieproces dat onderhevig is aan chroot(2) en verder in de sandbox zit op de meeste grote platformen.
Een double-free bug betekent dat een geheugenblok dat je al hebt teruggestuurd naar het besturingssysteem om opnieuw te worden gebruikt in andere delen van je programma...
…wordt later weer teruggegeven door een deel van het programma dat dat geheugen niet langer "eigenaar" is, maar niet weet dat het dat niet is.
(Of met opzet teruggegeven op verzoek van code die de bug met opzet probeert uit te lokken om een kwetsbaarheid in een exploiteren.)
Dit kan leiden tot subtiele en moeilijk te ontrafelen bugs, vooral als het systeem het vrijgekomen blok als beschikbaar markeert bij de eerste free()
gebeurt, wijst het later toe aan een ander deel van uw code wanneer het om geheugen vraagt via malloc(
), en markeert vervolgens het blok weer vrij wanneer de overbodige oproep naar free()
Verschijnt.
Dat laat je achter in het soort situatie dat je ervaart wanneer je incheckt in een hotel dat zegt: “Oh, goed nieuws! We dachten dat we vol zaten, maar een andere gast besloot net vroeg uit te checken, zodat je hun kamer kunt hebben.”
Zelfs als de kamer netjes is schoongemaakt en klaargemaakt voor nieuwe bewoners wanneer u binnenkomt, en het er dus uitziet alsof deze correct is toegewezen voor uw exclusieve gebruik, moet u er nog steeds op kunnen vertrouwen dat de keycard van de vorige gast inderdaad correct is geannuleerd en dat hun " vroeg uitchecken” was geen sluwe list om later op dezelfde dag terug te sluipen en je laptop te stelen.
Bugfix voor bugfix
Ironisch genoeg, als je naar de recente OpenSSH-codegeschiedenis kijkt, zul je zien dat OpenSSH een bescheiden bug had in een functie genaamd compat_kex_proposal()
, gebruikt om te controleren wat voor soort sleuteluitwisselingsalgoritme moet worden gebruikt bij het opzetten van een verbinding.
Maar het repareren van die bescheiden bug bracht in plaats daarvan een ernstiger kwetsbaarheid met zich mee.
Trouwens, de aanwezigheid van de bug in een deel van de software die wordt gebruikt tijdens het opzetten van een verbinding maakt dit tot een zogenaamde netwerkbereikbare pre-authenticatie kwetsbaarheid (of pre-authenticatiefout in het kort).
De double-free bug gebeurt in code die moet worden uitgevoerd na een client heeft een sessie op afstand gestart, maar vaardigheden elke sleutelovereenkomst of authenticatie heeft plaatsgevonden, dus de kwetsbaarheid kan in theorie worden geactiveerd voordat wachtwoorden of cryptografische sleutels ter validatie zijn aangeboden.
In OpenSSH 9.0, compat_kex_proposal
zag er ongeveer zo uit (hier sterk vereenvoudigd):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
Het idee is dat de beller zijn eigen geheugenblok doorgeeft dat een tekstreeks bevat die een instelling voor sleuteluitwisseling suggereert, en ofwel een goedkeuring terugkrijgt om de suggestie die hij heeft ingestuurd te gebruiken, ofwel een nieuw toegewezen tekstreeks met een bijgewerkte suggestie. .
De bug is dat als voorwaarde 1 onwaar is, maar voorwaarden 2 en 3 beide waar zijn, de code toewijst twee nieuwe tekenreeksen, maar retourneert alleen een.
Het geheugenblok toegewezen door allocatenewstring1()
wordt nooit vrijgegeven, en wanneer de functie terugkeert, is het geheugenadres voor altijd verloren, dus er is geen manier voor code om free()
het in de toekomst.
Dat blok wordt in wezen verlaten, waardoor wat bekend staat als een geheugenlek.
Na verloop van tijd kan dit problemen veroorzaken, misschien zelfs de server dwingen om af te sluiten om te herstellen van geheugenoverbelasting.
In OpenSSH 9.1 is de code geüpdatet in een poging om te voorkomen dat er twee strings worden toegewezen, maar dat er één wordt opgegeven:
/* 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; }
Dit heeft de double-free bug, want als voorwaarde 1 en voorwaarde 2 beide onwaar zijn, maar voorwaarde 3 is waar, dan wijst de code een nieuwe string toe om als antwoord terug te sturen...
... maar maakt ten onrechte de string vrij die de beller oorspronkelijk heeft ingevoerd, omdat de functie allocatenewstring1()
wordt nooit aangeroepen om de variabele bij te werken suggestion
.
De doorgegeven suggestietekenreeks is geheugen dat toebehoort aan de beller, en dat de beller daarom later zichzelf zal vrijmaken, wat leidt tot het dubbele-vrije gevaar.
In OpenSSH 9.2 is de code voorzichtiger geworden, waarbij alle drie mogelijke gebruikte geheugenblokken worden bijgehouden: het origineel suggestion
(geheugen dat eigendom is van iemand anders), en twee mogelijke nieuwe strings die onderweg kunnen worden toegewezen:
/* 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; }
Als voorwaarde 1 waar is, wordt een nieuwe kopie van de doorgegeven tekenreeks gebruikt, zodat de beller dit later kan doen free()
het geheugen van hun doorgegeven string wanneer ze maar willen.
Als we voorbij voorwaarde 1 komen en voorwaarde 2 is waar maar voorwaarde 3 is onwaar, dan wordt de alternatieve suggestie gemaakt door allocatenewstring1()
wordt teruggegeven, en de doorgegeven-in suggestion
touw wordt met rust gelaten.
Als voorwaarde 2 onwaar is en voorwaarde 3 waar is, wordt een nieuwe tekenreeks gegenereerd en geretourneerd, en doorgegeven suggestion
touw wordt met rust gelaten.
Als zowel voorwaarde 2 als voorwaarde 3 waar zijn, worden onderweg twee nieuwe strings toegewezen; de eerste komt vrij omdat hij niet nodig is; de tweede wordt geretourneerd; en de invaller suggestion
touw wordt met rust gelaten.
Je kunt RTxM om dat te bevestigen als u belt free(newone)
wanneer newone
is NULL
, dan “wordt er geen bewerking uitgevoerd”, want dat is altijd veilig free(NULL)
. Desalniettemin beschermen veel programmeurs er nog steeds robuust tegen met code zoals if (ptr != NULL) { free(ptr); }
.
Wat te doen?
Zoals het OpenSSH-team suggereert, zal het moeilijk zijn om deze bug te misbruiken, niet in de laatste plaats vanwege de beperkte privileges die de sshd
programma heeft terwijl het de verbinding opzet voor gebruik.
Desalniettemin meldden ze het als een beveiligingslek, want dat is het, dus zorg ervoor dat je hebt bijgewerkt naar OpenSSH 9.2.
En als je code schrijft in C, onthoud dan dat, hoe ervaren je ook bent, geheugenbeheer gemakkelijk fout kan gaan...
... dus wees voorzichtig.
(Ja, Rust en zijn moderne vrienden wel helpen u om de juiste code te schrijven, maar soms moet je nog steeds C gebruiken, en zelfs Rust kan dat niet garanderen stop met het schrijven van onjuiste code als je onoordeelkundig programmeert!)
- Door SEO aangedreven content en PR-distributie. Word vandaag nog versterkt.
- Platoblockchain. Web3 Metaverse Intelligentie. Kennis versterkt. Toegang hier.
- Bron: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/
- 1
- 1999
- 9
- a
- boven
- absoluut
- toegang
- werkelijk
- adres
- aangenomen
- Na
- tegen
- algoritme
- Alles
- toegewezen
- ken toe
- Het toestaan
- alleen
- al
- alternatief
- Hoewel
- altijd
- te midden van
- en
- Nog een
- toepassingen
- goedkeuring
- Australisch
- authenticatie
- auteur
- auto
- Beschikbaar
- terug
- achtergrond
- background-image
- omdat
- worden
- vaardigheden
- geloofde
- BEST
- Blok
- Blokken
- grens
- Onder
- Bug
- bugs
- bouw
- Bellen
- Dit betekent dat we onszelf en onze geliefden praktisch vergiftigen.
- bezoeker
- oproepen
- verzorging
- Veroorzaken
- veroorzakend
- voorzichtig
- Centreren
- zeker
- goedkoper
- controle
- klant
- code
- codeur
- Collectie
- kleur
- COM
- hoe
- komst
- commercieel
- componenten
- computer
- voorwaarde
- voorwaarden
- Bevestigen
- Verbinden
- gekoppeld blijven
- Wij verbinden
- versterken
- aansluitingen
- bevat
- hedendaags
- kopiëren
- kon
- cursus
- deksel
- en je merk te creëren
- aangemaakt
- Wij creëren
- cryptografische
- GEVAAR
- gegevens
- dag
- dagen
- beslist
- toegewijd aan
- Ontwikkelaar
- ontwikkelaars
- systemen
- DEED
- De
- moeilijk
- Display
- distributie
- Uitkeringen
- Nee
- dubbel-vrij
- beneden
- gedurende
- elk
- Vroeg
- gemakkelijk
- effectief
- beide
- encryptie
- eindigt
- Engeland
- Geheel
- vooral
- in wezen
- Zelfs
- OOIT
- Alle
- iedereen
- Nieuwste vermeldingen
- ervaring
- ervaren
- vertrouwd
- Voordelen
- Bestanden
- Voornaam*
- Vis
- Bepalen
- fout
- stroom
- Focus
- gevolgd
- volgt
- altijd
- gevonden
- Gratis
- vrienden
- oppompen van
- vol
- functie
- verder
- toekomst
- algemeen
- gegenereerde
- krijgen
- reus
- Go
- goed
- sterk
- garantie
- bewaker
- Gast
- Hackers
- gebeurt
- Hard
- Hoogte
- hier
- geschiedenis
- Hit
- Gat
- Home
- hoop
- hotel
- zweven
- Hoe
- HTML
- HTTPS
- idee
- per direct
- uitvoering
- in
- Anders
- omvatten
- Inclusief
- inclusie
- onjuist
- Indië
- moment
- verkrijgen in plaats daarvan
- interactieve
- Internet
- internet van dingen
- geïntroduceerd
- iot
- Iot (internet der dingen)
- IT
- zelf
- houden
- toetsen
- blijven
- bekend
- Gebrek
- laptop
- Laat
- lagen
- leiden
- leidend
- Licenties
- Beperkt
- Lijn
- LINK
- linux
- logo
- langer
- Kijk
- keek
- LOOKS
- gemaakt
- groot
- maken
- MERKEN
- beheer
- management
- Marge
- Materie
- max-width
- middel
- Geheugen
- vermeld
- Microsoft
- macht
- fouten
- Modern
- meer
- meest
- naam
- Genoemd
- Noodzaak
- nodig
- behoeften
- netwerk
- niettemin
- New
- een
- Aanbod
- officieel
- EEN
- open
- open source
- werkzaam
- besturingssysteem
- operatie
- bestellen
- origineel
- oorspronkelijk
- Overige
- het te bezitten.
- eigendom
- deel
- onderdelen
- voorbij
- passes
- Wachtwoord
- wachtwoorden
- verleden
- pad
- Paul
- misschien
- phone
- Fysiek
- plaats
- platforms
- Plato
- Plato gegevensintelligentie
- PlatoData
- Populair
- positie
- mogelijk
- Berichten
- bereid
- aanwezigheid
- gepresenteerd
- vorig
- voorrechten
- waarschijnlijk
- probleem
- Programma
- Programmeurs
- naar behoren
- protocol
- doel
- snel
- klaar
- vast
- real-time
- ontvangen
- recent
- Herstellen
- regelmatig
- los
- betrouwbaar
- niet vergeten
- vanop
- remote access
- verslag
- gemeld
- respectievelijk
- terugkeer
- Retourneren
- Riskant
- Kamer
- lopen
- Roest
- veilig
- Veiligheid
- dezelfde
- Wetenschapper
- scherm
- Tweede
- vast
- veiligheid
- serie-
- Diensten
- Sessie
- sessies
- reeks
- het instellen van
- setup
- streng
- Shell
- Bermuda's
- stilgelegd
- gelijk
- Eenvoudig
- vereenvoudigd
- situatie
- sluipen
- So
- Software
- solide
- Iemand
- iets
- Spoedig
- bron
- snelheid
- spikes
- Spot
- standaard
- staat
- begin
- Still
- sterke
- onderwerpen
- dergelijk
- Stelt voor
- ondersteuning
- SVG
- system
- Nemen
- team
- terminal
- De
- Het blok
- hun
- Er.
- daarom
- spullen
- gedachte
- drie
- niet de tijd of
- keer
- Titel
- naar
- vandaag
- tools
- toolkit
- tools
- top
- Totaal
- spoor
- overgang
- transparant
- veroorzaakt
- moeite
- waar
- Trust
- BEURT
- typisch
- unix
- bijwerken
- bijgewerkt
- URL
- .
- Gebruiker
- doorgaans
- bevestiging
- versie
- via
- kwetsbaarheid
- gezocht
- bekend
- Wat
- en
- WIE
- wijd
- wil
- ruiten
- zonder
- zou
- schrijven
- het schrijven van
- geschreven
- jaar
- Your
- zephyrnet