Open-source-operativsystemdistributionen OpenBSD er velkendt blandt sysadmins, især dem, der administrerer servere, for dets fokus på sikkerhed over hastighed, funktioner og smarte front-ends.
Passende nok er dens logo måske en pufferfisk - oppustet, med dens pigge klar til at afvise alle listige hackere, der måtte komme med.
Men OpenBSD-teamet er nok bedst kendt ikke for hele sin distro, men for fjernadgangsværktøjssættet OpenSSH der blev skrevet i slutningen af 1990'erne for at blive inkluderet i selve operativsystemet.
SSH, forkortelse for sikker skal, blev oprindeligt skabt af finsk datalog Tatu Ylönen i midten af 1990'erne i håbet om at vænne sysadmins fra den risikable vane med at bruge Telnet-protokollen.
Problemet med Telnet
Telnet var bemærkelsesværdigt simpelt og effektivt: I stedet for at forbinde fysiske ledninger (eller bruge et modem over en telefonlinje) for at lave en teletypeforbindelse til fjernservere, brugte du i stedet en TELetype NETwork-forbindelse.
Grundlæggende blev de data, der normalt ville flyde frem og tilbage over en dedikeret seriel forbindelse eller opkaldstelefonlinje, sendt og modtaget over internettet ved hjælp af en pakkekoblet TCP-netværksforbindelse i stedet for en kredsløbskoblet punkt-til-punkt-forbindelse .
Samme velkendte login-system, billigere forbindelser, intet behov for dedikerede datalinjer!
Den gigantiske fejl i Telnet var selvfølgelig dens totale mangel på kryptering, så det var trivielt at opsnuse din nøjagtige terminalsession, hvilket gjorde det muligt for crackere at se hver kommando, du skrev (selv de fejl, du lavede, og alle de gange, du ramte [Backspace]
), og hver byte output produceret...
…og selvfølgelig dit brugernavn og adgangskode i starten af sessionen.
Enhver på din netværkssti kunne ikke kun nemt rekonstruere dine sysadmin-sessioner i realtid på deres egen skærm, men sandsynligvis også manipulere med din session ved at ændre de kommandoer, du sendte til fjernserveren og forfalske, at svarene kom tilbage, så du ikke lagde mærke til det. undergrunden.
De kunne endda oprette en bedragerserver, lokke dig til den og gøre det overraskende svært for dig at få øje på bedraget.
Stærk kryptering FTW
Ylönens SSH havde til formål at tilføje et lag af stærk kryptering og autentificering til hver ende af en Telnet-lignende session, hvilket skaber en sikker skal (det er hvad navnet står for, hvis du nogensinde har undret dig, selvom næsten alle bare kalder det ess-ess-aitch disse dage).
Det var et øjeblikkeligt hit, og protokollen blev hurtigt overtaget af sysadmins overalt.
OpenSSH fulgte snart efter, som vi nævnte ovenfor, og dukkede først op i slutningen af 1999 som en del af OpenBSD 2.6 frigive.
OpenBSD-teamet ønskede at skabe en gratis, pålidelig, open source-implementering af den protokol, som de og enhver anden kunne bruge, uden nogen af de licenser eller kommercielle komplikationer, der havde behæftet Ylönens oprindelige implementering i årene umiddelbart efter dets udgivelse.
Faktisk, hvis du kører Windows SSH-serveren og opretter forbindelse til den fra en Linux-computer lige nu, vil du næsten helt sikkert stole på OpenSSH-implementeringen i begge ender.
SSH-protokollen bruges også i andre populære klient-servertjenester, herunder SCP og SFTP, en forkortelse for sikker kopi , sikker FTP henholdsvis. SSH betyder løst "tilslut sikkert og kør en kommando SHell i den anden ende", typisk for interaktive logins, fordi Unix-programmet til en kommandoskal normalt er /bin/sh
. SCP er ens, men for kopiering af filer, fordi Unix-fil-kopi-kommandoen generelt kaldes /bin/cp
, og SFTP hedder stort set på samme måde.
OpenSSH er ikke det eneste SSH-værktøjssæt i byen.
Andre velkendte implementeringer inkluderer: libssh2, for udviklere, der ønsker at bygge SSH-understøttelse direkte ind i deres egne applikationer; dropbear, en strippet SSH-server fra australsk koder Matt johnston der findes i vid udstrækning på såkaldte IoT (Internet of Things) enheder såsom hjemmeroutere og printere; og PuTTY, en populær, gratis samling af SSH-relaterede værktøjer til Windows fra indie open source-udvikler Simon Tatham i England.
Men hvis du er en almindelig SSH-bruger, har du næsten helt sikkert oprettet forbindelse til mindst én OpenSSH-server i dag, ikke mindst fordi de fleste moderne Linux-distributioner inkluderer det som deres standard fjernadgangsværktøj, og Microsoft tilbyder både en OpenSSH-klient og en OpenSSH server som officielle Windows-komponenter i disse dage.
Dobbeltfri fejlrettelse
OpenSSH version 9.2 lige kommet ud, og den udgivelses noter indberette som følger:
Denne udgivelse indeholder rettelser til […] et hukommelsessikkerhedsproblem. [Denne fejl] menes ikke at kunne udnyttes, men vi rapporterer de fleste netværks-tilgængelige hukommelsesfejl som sikkerhedsfejl.
Fejlen påvirker sshd
, OpenSSH-serveren (den -d
suffiks står for daemon, Unix-navnet for den slags baggrundsproces, som Windows kalder en tjeneste):
sshd(8): rette en dobbeltfri hukommelsesfejl før godkendelse introduceret i OpenSSH 9.1. Dette menes ikke at kunne udnyttes, og det forekommer i den uprivilegerede præ-godkendelsesproces, der er underlagt chroot(2) og er yderligere sandboxed på de fleste større platforme.
En dobbeltfri fejl betyder, at en hukommelsesblok, du allerede har vendt tilbage til operativsystemet for at blive genbrugt i andre dele af dit program...
… vil senere blive afleveret igen af en del af programmet, der ikke længere faktisk "ejer" denne hukommelse, men som ikke ved, at den ikke gør det.
(Eller afleveres bevidst tilbage ved opfordring til kode, der forsøger at provokere fejlen med vilje for at slå en sårbarhed ind i en udnytte.)
Dette kan føre til subtile og svære at optrevle fejl, især hvis systemet markerer den frigjorte blok som tilgængelig, når den første free()
sker, tildeler den senere til en anden del af din kode, når den beder om hukommelse via malloc(
), og markerer derefter blokken fri igen, når det overflødige kalder til free()
kommer til syne.
Det efterlader dig i den slags situation, du oplever, når du tjekker ind på et hotel, der siger: "Åh, gode nyheder! Vi troede, vi var fyldt op, men en anden gæst besluttede lige at tjekke ud tidligt, så du kan få deres værelse."
Selvom værelset er pænt rengjort og klargjort til nye beboere, når du går ind, og dermed ser ud som om, det var ordentligt allokeret til dit eget brug, skal du stadig stole på, at den tidligere gæsts nøglekort faktisk blev annulleret korrekt, og at deres “ tidlig checkout” var ikke en snedig list at snige sig tilbage senere samme dag og stjæle din bærbare computer.
Bug fix til fejlrettelse
Ironisk nok, hvis du ser på den seneste OpenSSH-kodehistorik, vil du se, at OpenSSH havde en beskeden fejl i en funktion kaldet compat_kex_proposal()
, bruges til at kontrollere, hvilken slags nøgleudvekslingsalgoritme, der skal bruges, når du opretter en forbindelse.
Men at rette den beskedne fejl introducerede i stedet en mere alvorlig sårbarhed.
Tilstedeværelsen af fejlen i en del af softwaren, der bruges under opsætningen af en forbindelse, er i øvrigt det, der gør dette til en såkaldt netværks-tilgængelig forhåndsgodkendelse sårbarhed (eller fejl før godkendelse for kort).
Den dobbeltfrie fejl sker i kode, der skal køre efter en klient har startet en fjernsession, men før enhver nøgleaftale eller autentificering har fundet sted, så sårbarheden kan i teorien udløses, før nogen adgangskoder eller kryptografiske nøgler er blevet præsenteret til validering.
I OpenSSH 9.0, compat_kex_proposal
så sådan ud (meget forenklet her):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
Ideen er, at den, der ringer, går ind i deres egen hukommelsesblok indeholdende en tekststreng, der foreslår en nøgleudvekslingsindstilling, og får enten en godkendelse tilbage til at bruge selve det forslag, de har sendt ind, eller en nytildelt tekststreng med et opdateret forslag .
Fejlen er, at hvis betingelse 1 er falsk, men betingelse 2 og 3 begge er sande, allokeres koden to nye tekststrenge, men vender kun tilbage en.
Hukommelsesblokken tildelt af allocatenewstring1()
bliver aldrig frigivet, og når funktionen vender tilbage, er dens hukommelsesadresse tabt for altid, så der er ingen måde for nogen kode at free()
det i fremtiden.
Denne blok er i det væsentlige forladt, hvilket forårsager, hvad der er kendt som en hukommelsestab.
Over tid kan dette forårsage problemer, måske endda tvinge serveren til at lukke ned for at komme sig efter hukommelsesoverbelastning.
I OpenSSH 9.1 blev koden opdateret i et forsøg på at undgå at allokere to strenge, men at opgive en af 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; }
Dette har den dobbeltfrie fejl, for hvis betingelse 1 og betingelse 2 begge er falske, men betingelse 3 er sand, tildeler koden en ny streng, der skal sendes tilbage som svar...
…men frigiver forkert den streng, som den, der ringer, oprindeligt har sendt i, fordi funktionen allocatenewstring1()
bliver aldrig kaldt for at opdatere variablen suggestion
.
Den indsendte forslagsstreng er hukommelse, der tilhører den, der ringer, og at den, der ringer, derfor vil frigøre temaer senere, hvilket fører til den dobbelte frie fare.
I OpenSSH 9.2 er koden blevet mere forsigtig, idet den holder styr på alle tre mulige hukommelsesblokke, der bruges: den originale suggestion
(hukommelse ejet af en anden), og to mulige nye strenge, der kan tildeles på vejen:
/* 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; }
Hvis betingelse 1 er sand, bruges en ny kopi af den indsendte streng, så den, der ringer, kan senere free()
deres indsendte strengs hukommelse, når de vil.
Hvis vi kommer forbi betingelse 1, og betingelse 2 er sand, men betingelse 3 er falsk, så er det alternative forslag skabt af allocatenewstring1()
bliver returneret, og indleveringen suggestion
streng efterlades alene.
Hvis betingelse 2 er falsk, og betingelse 3 er sand, genereres og returneres en ny streng, og den indsendte suggestion
streng efterlades alene.
Hvis både betingelse 2 og betingelse 3 er sande, bliver to nye strenge tildelt undervejs; den første bliver frigjort, fordi den ikke er nødvendig; den anden returneres; og den indleverede suggestion
streng efterlades alene.
Du kan RTxM for at bekræfte det, hvis du ringer free(newone)
hvornår newone
is NULL
, så "udføres ingen operation", for det er altid sikkert at free(NULL)
. Ikke desto mindre beskytter masser af programmører sig stadig robust mod det med kode som f.eks if (ptr != NULL) { free(ptr); }
.
Hvad skal jeg gøre?
Som OpenSSH-teamet foreslår, vil det være svært at udnytte denne fejl, ikke mindst på grund af de begrænsede privilegier, som sshd
programmet har, mens det opsætter forbindelsen til brug.
Ikke desto mindre rapporterede de det som et sikkerhedshul, fordi det er hvad det er, så sørg for at du har opdateret til OpenSSH 9.2.
Og hvis du skriver kode i C, så husk, at uanset hvor erfaren du bliver, er hukommelsesstyring let at tage fejl...
...så pas på derude.
(Ja, Rust og dens moderne venner vil hjælpe dig med at skrive korrekt kode, men nogle gange bliver du stadig nødt til at bruge C, og selv Rust kan ikke garantere det stoppe dig med at skrive forkert kode hvis du programmerer uretfærdigt!)
- SEO Powered Content & PR Distribution. Bliv forstærket i dag.
- Platoblokkæde. Web3 Metaverse Intelligence. Viden forstærket. Adgang her.
- Kilde: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/
- 1
- 1999
- 9
- a
- over
- absolutte
- adgang
- faktisk
- adresse
- vedtaget
- Efter
- mod
- algoritme
- Alle
- allokeret
- allokerer
- tillade
- alene
- allerede
- alternativ
- Skønt
- altid
- blandt
- ,
- En anden
- applikationer
- godkendelse
- australsk
- Godkendelse
- forfatter
- auto
- til rådighed
- tilbage
- baggrund
- background-billede
- fordi
- bliver
- før
- troede
- BEDSTE
- Bloker
- Blocks
- grænse
- Bund
- Bug
- bugs
- bygge
- ringe
- kaldet
- Caller
- Opkald
- hvilken
- Årsag
- forårsager
- forsigtig
- center
- sikkert
- billigere
- kontrollere
- kunde
- kode
- koder
- samling
- farve
- KOM
- Kom
- kommer
- kommerciel
- komponenter
- computer
- betingelse
- betingelser
- Bekræfte
- Tilslut
- tilsluttet
- Tilslutning
- tilslutning
- Tilslutninger
- indeholder
- moderne
- kopiering
- kunne
- Kursus
- dæksel
- skabe
- oprettet
- Oprettelse af
- kryptografisk
- FARE
- data
- dag
- Dage
- besluttede
- dedikeret
- Udvikler
- udviklere
- Enheder
- DID
- Die
- svært
- Skærm
- fordeling
- Distributioner
- Er ikke
- dobbeltfri
- ned
- i løbet af
- hver
- Tidligt
- nemt
- Effektiv
- enten
- kryptering
- ender
- England
- Hele
- især
- væsentlige
- Endog
- NOGENSINDE
- Hver
- alle
- Eksklusiv
- erfaring
- erfarne
- bekendt
- Funktionalitet
- Filer
- Fornavn
- Fisk
- Fix
- fejl
- flow
- Fokus
- efterfulgt
- følger
- evigt
- fundet
- Gratis
- venner
- fra
- fuld
- funktion
- yderligere
- fremtiden
- generelt
- genereret
- få
- kæmpe
- Go
- godt
- stærkt
- garanti
- Guard
- Gæst
- hackere
- sker
- Hård Ost
- højde
- link.
- historie
- Hit
- Hole
- Home
- håber
- Hotel
- hover
- Hvordan
- HTML
- HTTPS
- idé
- straks
- implementering
- in
- I andre
- omfatter
- Herunder
- inklusion
- forkert
- øjeblikkelig
- i stedet
- interaktiv
- Internet
- tingenes internet
- introduceret
- tingenes internet
- Iot (tingenes internet)
- IT
- selv
- holde
- nøgler
- Kend
- kendt
- Mangel
- laptop
- Sent
- lag
- føre
- førende
- Licenser
- Limited
- Line (linje)
- LINK
- linux
- logo
- længere
- Se
- kiggede
- UDSEENDE
- lavet
- større
- lave
- maerker
- administrere
- ledelse
- Margin
- Matter
- max-bredde
- midler
- Hukommelse
- nævnte
- microsoft
- måske
- fejl
- Moderne
- mere
- mest
- navn
- Som hedder
- Behov
- behov
- netværk
- Ikke desto mindre
- Ny
- normal
- Tilbud
- officiel
- ONE
- åbent
- open source
- drift
- operativsystem
- drift
- ordrer
- original
- oprindeligt
- Andet
- egen
- ejede
- del
- dele
- Bestået
- gennemløb
- Adgangskode
- Nulstilling/ændring af adgangskoder
- forbi
- sti
- paul
- måske
- telefon
- fysisk
- Place
- Platforme
- plato
- Platon Data Intelligence
- PlatoData
- Populær
- position
- mulig
- Indlæg
- forberedt
- tilstedeværelse
- forelagt
- tidligere
- privilegier
- sandsynligvis
- Problem
- behandle
- Program
- Programmører
- korrekt
- protokol
- formål
- hurtigt
- klar
- ægte
- realtid
- modtaget
- nylige
- Recover
- fast
- frigive
- pålidelig
- huske
- fjern
- Remote Access
- indberette
- rapporteret
- afkast
- afkast
- Risikabel
- Værelse
- Kør
- Rust
- sikker
- Sikkerhed
- samme
- Videnskabsmand
- Skærm
- Anden
- sikkert
- sikkerhed
- seriel
- Servere
- Tjenester
- Session
- sessioner
- sæt
- indstilling
- setup
- svær
- Shell
- Kort
- Luk ned
- lignende
- Simpelt
- forenklet
- Situationen
- snige
- So
- Software
- solid
- Nogen
- noget
- Kilde
- hastighed
- spikes
- Spot
- standard
- står
- starte
- Stadig
- stærk
- emne
- sådan
- foreslår
- support
- SVG
- systemet
- Tag
- hold
- terminal
- Blokken
- deres
- Der.
- derfor
- ting
- tænkte
- tre
- tid
- gange
- Titel
- til
- i dag
- værktøj
- toolkit
- værktøjer
- top
- I alt
- spor
- overgang
- gennemsigtig
- udløst
- problemer
- sand
- Stol
- TUR
- typisk
- unix
- Opdatering
- opdateret
- URL
- brug
- Bruger
- sædvanligvis
- validering
- udgave
- via
- sårbarhed
- ønskede
- Kendt
- Hvad
- mens
- WHO
- bredt
- vilje
- vinduer
- uden
- ville
- skriver
- skrivning
- skriftlig
- år
- Du
- Din
- zephyrnet