Distribucija odprtokodnega operacijskega sistema OpenBSD je dobro znana med sistemskimi skrbniki, zlasti tistimi, ki upravljajo strežnike, zaradi svoje osredotočenosti na varnost namesto hitrosti, funkcij in modnih sprednjih koncev.
Morda je njegov logotip napihnjena riba napihovalka, s svojimi konicami, ki so pripravljene odvrniti vse premetene hekerje, ki bi lahko prišli zraven.
Toda ekipa OpenBSD verjetno ni najbolj znana po svoji celotni distribuciji, temveč po kompletu orodij za oddaljeni dostop OpenSSH ki je bil napisan v poznih devetdesetih za vključitev v sam operacijski sistem.
SSH, okrajšava za varna lupina, je prvotno ustvaril finski računalničar Tatu Ylönen sredi devetdesetih let prejšnjega stoletja v upanju, da bo sistemske skrbnike odvadil tvegane navade uporabe protokola Telnet.
Težave s Telnetom
Telnet je bil izjemno preprost in učinkovit: namesto povezovanja fizičnih žic (ali uporabe modema prek telefonske linije) za vzpostavitev teletype povezave z oddaljenimi strežniki ste namesto tega uporabili povezavo TELetype NETwork.
V bistvu so bili podatki, ki običajno tečejo naprej in nazaj prek namenske serijske povezave ali klicne telefonske linije, poslani in prejeti prek interneta z uporabo paketno komutirane omrežne povezave TCP namesto povezave od točke do točke s komutacijo vezja. .
Isti znani sistem prijave, cenejše povezave, ni potrebe po namenskih podatkovnih linijah!
Ogromna napaka v Telnetu je bila seveda popolna pomanjkljivost šifriranja, tako da je bilo odkrivanje vaše natančne terminalske seje nepomembno, kar je krekerjem omogočilo, da vidijo vsak ukaz, ki ste ga vnesli (tudi napake, ki ste jih naredili, in vse čase, ko ste pritisnili [Backspace]
), in vsak bajt proizvedenega izhoda ...
…in seveda vaše uporabniško ime in geslo na začetku seje.
Kdor koli na vaši omrežni poti ne bi mogel le preprosto rekonstruirati vaših sej sistemskega skrbnika v realnem času na lastnem zaslonu, ampak verjetno tudi posegati v vašo sejo s spreminjanjem ukazov, ki ste jih poslali oddaljenemu strežniku, in ponarejanjem povratnih odgovorov, tako da niste opazili pretvarjanje.
Lahko celo vzpostavijo lažni strežnik, vas zvabijo vanj in vam presenetljivo otežijo odkrivanje prevare.
Močno šifriranje FTW
Ylönenov SSH je želel dodati plast močnega šifriranja in avtentikacije na vsak konec seje, podobne Telnetu, in ustvariti varna lupina (to pomeni ime, če ste se kdaj spraševali, čeprav ga skoraj vsi kličejo samo ess-ess-aitch te dni).
Bil je takojšen hit in protokol so hitro sprejeli sistemski skrbniki povsod.
Kmalu je sledil OpenSSH, kot smo omenili zgoraj, prvič se je pojavil konec leta 1999 kot del OpenBSD 2.6 sprostiti.
Ekipa OpenBSD je želela ustvariti brezplačno, zanesljivo, odprtokodno izvedbo protokola, ki so jo in kdo drug bi lahko uporabil, brez kakršnih koli licenčnih ali komercialnih zapletov, ki so obremenjevali prvotno izvedbo Ylönena v letih takoj po izdaji.
Dejansko, če zaženete Windows SSH strežnik in se nanj povežete iz računalnika Linux prav zdaj, se boste skoraj zagotovo zanašali na implementacijo OpenSSH na obeh koncih.
Protokol SSH se uporablja tudi v drugih priljubljenih storitvah odjemalec-strežnik, vključno s SCP in SFTP, okrajšava za varna kopija in varen FTP oz. SSH ohlapno pomeni "varno se poveži in zaženi ukaz SHell na drugem koncu", običajno za interaktivne prijave, ker je program Unix za ukazno lupino običajno /bin/sh
. SCP je podoben, vendar za kopiranje datotek, ker se na splošno kliče ukaz za kopiranje datoteke Unix /bin/cp
, SFTP pa je poimenovan na približno enak način.
OpenSSH ni edini komplet orodij SSH v mestu.
Druge dobro znane izvedbe vključujejo: libssh2, za razvijalce, ki želijo vgraditi podporo za SSH neposredno v svoje aplikacije; dropbear, skrajšani strežnik SSH avstralskega koderja matt johnston ki ga pogosto najdemo na tako imenovanih napravah IoT (Internet of Things), kot so domači usmerjevalniki in tiskalniki; in PuTTY, priljubljena brezplačna zbirka orodij za Windows, povezanih s SSH, neodvisnega odprtokodnega razvijalca Simon Tatham v Angliji.
Toda če ste redni uporabnik SSH, ste se danes skoraj zagotovo povezali z vsaj enim strežnikom OpenSSH, nenazadnje zato, ker ga večina sodobnih distribucij Linuxa vključuje kot svoje standardno orodje za oddaljeni dostop, Microsoft pa ponuja odjemalca OpenSSH in OpenSSH strežnik kot uradne komponente sistema Windows v teh dneh.
Dvojni popravek napak
OpenSSH različica 9.2 pravkar prišel ven, in opombe k izdaji poročajo takole:
Ta izdaja vsebuje popravke za […] težavo z varnostjo pomnilnika. [Te napake] naj ne bi bilo mogoče izkoristiti, vendar poročamo o večini napak v pomnilniku, ki je dosegljiv v omrežju, kot varnostnih napakah.
Napaka vpliva sshd
, strežnik OpenSSH ( -d
pripona pomeni demon, ime Unix za vrsto procesa v ozadju, ki ga Windows kliče a Storitev):
sshd(8): popravi napako dvojnega prostega pomnilnika pred preverjanjem pristnosti, uvedeno v OpenSSH 9.1. Tega naj ne bi bilo mogoče izkoriščati in se zgodi v neprivilegiranem postopku predavtifikacije, ki je podvržen chroot(2) in je dodatno peskovnik na večini glavnih platform.
Napaka brez dvojne napake pomeni, da pomnilniški blok, ki ste ga že vrnili v operacijski sistem, da bi ga ponovno uporabili v drugih delih vašega programa ...
... bo kasneje ponovno vrnjen s strani dela programa, ki dejansko ni več »lastnik« tega pomnilnika, vendar ne ve, da ga nima.
(Ali vrnjeno namerno na poziv kode, ki poskuša namenoma sprožiti napako, da bi spremenila ranljivost v an izkoriščanje.)
To lahko vodi do subtilnih in težko odkritih hroščev, zlasti če sistem označi sproščeni blok kot na voljo, ko prvi free()
zgodi, ga pozneje dodeli drugemu delu vaše kode, ko zahteva pomnilnik prek malloc(
), nato pa blok znova označi kot prost, ko je odvečen klic na free()
se prikaže.
To vas pusti v situaciji, kot jo doživite, ko se prijavite v hotel, ki pravi: »Oh, dobra novica! Mislili smo, da smo polni, vendar se je drugi gost odločil, da se bo zgodaj odjavil, da boste lahko imeli njegovo sobo.«
Tudi če je soba lepo očiščena in pripravljena za nove stanovalce, ko vstopite vanjo, in torej izgleda, kot da je bila pravilno dodeljena za vašo izključno uporabo, morate še vedno verjeti, da je bila ključna kartica prejšnjega gosta res pravilno preklicana in da je njihov “ zgodnja odjava« ni bila pretkana zvijača, da bi se kasneje istega dne prikradel nazaj in vam ukradel prenosni računalnik.
Popravek napak za odpravo napak
Ironično je, da če pogledate nedavno zgodovino kode OpenSSH, boste videli, da je imel OpenSSH skromno napako v funkciji, imenovani compat_kex_proposal()
, ki se uporablja za preverjanje, kakšen algoritem za izmenjavo ključev uporabiti pri vzpostavljanju povezave.
Toda popravljanje te skromne napake je namesto tega povzročilo resnejšo ranljivost.
Mimogrede, prisotnost hrošča v delu programske opreme, ki se uporablja med nastavitvijo povezave, je tisto, zaradi česar je to t.i. omrežno dosegljiva predavtentikacija ranljivost (oz napaka pred avtorizacijo na kratko).
Napaka dvojne brezplačnosti se zgodi v kodi, ki se mora zagnati po odjemalec je sprožil oddaljeno sejo, vendar pred prišlo je do kakršnega koli dogovora o ključu ali avtentikacije, tako da se lahko ranljivost teoretično sproži, preden so bila kakršna koli gesla ali kriptografski ključi predloženi v preverjanje.
V OpenSSH 9.0, compat_kex_proposal
izgledal nekako takole (tukaj močno poenostavljeno):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
Ideja je, da klicatelj posreduje svoj blok pomnilnika, ki vsebuje besedilni niz, ki predlaga nastavitev za izmenjavo ključev, in dobi nazaj ali odobritev za uporabo prav tistega predloga, ki ga je poslal, ali na novo dodeljen besedilni niz s posodobljenim predlogom .
Napaka je v tem, da če je pogoj 1 napačen, pogoja 2 in 3 pa sta resnična, koda dodeli dva novih besedilnih nizov, ampak samo vrne ena.
Pomnilniški blok, ki ga dodeli allocatenewstring1()
se nikoli ne sprosti, in ko se funkcija vrne, se njen pomnilniški naslov za vedno izgubi, tako da nobena koda ne more free()
to v prihodnosti.
Ta blok je v bistvu zapuščen, kar povzroča tisto, kar je znano kot a uhajanje pomnilnika.
Sčasoma lahko to povzroči težave, morda celo prisili strežnik, da se zaustavi, da si opomore od preobremenjenosti pomnilnika.
V OpenSSH 9.1 je bila koda posodobljena, da bi se izognili dodelitvi dveh nizov, vendar opustili enega od njiju:
/* 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; }
To ima napako dvojne brezplačnosti, ker če sta pogoj 1 in pogoj 2 napačna, pogoj 3 pa je resničen, potem koda dodeli nov niz, ki ga pošlje nazaj kot svoj odgovor ...
…vendar nepravilno sprosti niz, ki ga je klicatelj prvotno posredoval, ker funkcija allocatenewstring1()
nikoli ni poklican za posodobitev spremenljivke suggestion
.
Posredovan predlogni niz je pomnilnik, ki pripada klicatelju, in da bo klicatelj zato pozneje sprostil teme, kar vodi v nevarnost dvojne brezplačnosti.
V OpenSSH 9.2 je koda postala bolj previdna in spremlja vse tri možne uporabljene pomnilniške bloke: izvirni suggestion
(pomnilnik v lasti nekoga drugega) in dva možna nova niza, ki bi ju lahko dodelili na poti:
/* 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; }
Če je pogoj 1 resničen, se uporabi nova kopija posredovanega niza, tako da klicatelj lahko pozneje free()
spomin njihove predane vrvice, kadar koli želijo.
Če presežemo pogoj 1 in je pogoj 2 resničen, pogoj 3 pa napačen, potem alternativni predlog, ki ga ustvari allocatenewstring1()
se vrne in predano suggestion
niz ostane sam.
Če je pogoj 2 napačen in pogoj 3 resničen, se generira in vrne nov niz, posredovani suggestion
niz ostane sam.
Če sta oba pogoja 2 in pogoj 3 resnična, se med potjo dodelita dva nova niza; prvi se sprosti, ker ni potreben; drugi se vrne; in predanih suggestion
niz ostane sam.
Ti lahko RTxM da potrdite, da če pokličete free(newone)
kdaj newone
is NULL
, potem se »ne izvaja nobena operacija«, ker je to vedno varno free(NULL)
. Kljub temu se veliko programerjev še vedno močno ščiti pred njim s kodo, kot je npr if (ptr != NULL) { free(ptr); }
.
Kaj storiti?
Kot predlaga ekipa OpenSSH, bo izkoriščanje te napake težko, nenazadnje zaradi omejenih privilegijev, ki jih sshd
ima program med nastavljanjem povezave za uporabo.
Kljub temu so to prijavili kot varnostno luknjo, ker to je, zato se prepričajte, da ste posodobili na OpenSSH 9.2.
In če pišete kodo v C, ne pozabite, da se je pri upravljanju pomnilnika zlahka zmotiti, ne glede na to, kako izkušeni ste ...
… zato bodite previdni.
(Da, Rust in njegovi sodobni prijatelji bodo vam pomaga napisati pravilno kodo, vendar boste včasih še vedno morali uporabiti C in tudi Rust ne more zagotoviti nehaj pisati napačno kodo če programirate nespametno!)
- Distribucija vsebine in PR s pomočjo SEO. Okrepite se še danes.
- Platoblockchain. Web3 Metaverse Intelligence. Razširjeno znanje. Dostopite tukaj.
- vir: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/
- 1
- 1999
- 9
- a
- nad
- absolutna
- dostop
- dejansko
- Naslov
- sprejet
- po
- proti
- algoritem
- vsi
- dodeljenih
- dodeli
- Dovoli
- sam
- že
- alternativa
- Čeprav
- vedno
- med
- in
- Še ena
- aplikacije
- odobritev
- avstralski
- Preverjanje pristnosti
- Avtor
- avto
- Na voljo
- nazaj
- ozadje
- ozadja, slike
- ker
- postanejo
- pred
- Menimo
- BEST
- Block
- Bloki
- meja
- Bottom
- Bug
- hrošči
- izgradnjo
- klic
- se imenuje
- klicatelja
- poziva
- ki
- Vzrok
- povzroča
- previden
- center
- Zagotovo
- cenejša
- preveriti
- stranke
- Koda
- koder
- zbirka
- barva
- COM
- kako
- prihajajo
- komercialna
- deli
- računalnik
- stanje
- Pogoji
- Potrdi
- Connect
- povezane
- Povezovanje
- povezava
- povezave
- Vsebuje
- sodobna
- kopiranje
- bi
- Tečaj
- pokrov
- ustvarjajo
- ustvaril
- Ustvarjanje
- kriptografijo
- NEVARNOST
- datum
- dan
- Dnevi
- odločil
- namenjen
- Razvojni
- Razvijalci
- naprave
- DID
- Polnilna postaja
- težko
- zaslon
- distribucija
- Distribucije
- Ne
- dvojno brezplačno
- navzdol
- med
- vsak
- Zgodnje
- enostavno
- Učinkovito
- bodisi
- šifriranje
- konča
- Anglija
- Celotna
- zlasti
- v bistvu
- Tudi
- VEDNO
- Tudi vsak
- vsi
- Ekskluzivno
- izkušnje
- izkušen
- seznanjeni
- Lastnosti
- datoteke
- prva
- Ribe
- fiksna
- napaka
- Pretok
- Osredotočite
- sledili
- sledi
- za vedno
- je pokazala,
- brezplačno
- prijatelji
- iz
- polno
- funkcija
- nadalje
- Prihodnost
- splošno
- ustvarila
- dobili
- velikan
- Go
- dobro
- zelo
- Garancija
- Guard
- Gost
- hekerji
- se zgodi
- Trdi
- višina
- tukaj
- zgodovina
- hit
- Luknja
- Domov
- upam,
- Hotel
- hover
- Kako
- HTML
- HTTPS
- Ideja
- takoj
- Izvajanje
- in
- V drugi
- vključujejo
- Vključno
- vključitev
- nepravilno
- instant
- Namesto
- interaktivno
- Internet
- Internet stvari
- Uvedeno
- Internet stvari
- Iot (internet stvari)
- IT
- sam
- vzdrževanje
- tipke
- Vedite
- znano
- Pomanjkanje
- laptop
- Pozen
- plast
- vodi
- vodi
- licenciranje
- Limited
- vrstica
- LINK
- linux
- logo
- več
- Poglej
- Pogledal
- POGLEDI
- je
- velika
- Znamka
- IZDELA
- upravljanje
- upravljanje
- Marža
- Matter
- max širine
- pomeni
- Spomin
- omenjeno
- Microsoft
- morda
- napake
- sodobna
- več
- Najbolj
- Ime
- Imenovan
- Nimate
- potrebe
- mreža
- Kljub temu
- Novo
- normalno
- Ponudbe
- Uradni
- ONE
- odprite
- open source
- deluje
- operacijski sistem
- Delovanje
- Da
- izvirno
- originalno
- Ostalo
- lastne
- v lasti
- del
- deli
- opravil
- vozovnice
- Geslo
- gesla
- preteklosti
- pot
- paul
- mogoče
- telefon
- fizično
- Kraj
- Platforme
- platon
- Platonova podatkovna inteligenca
- PlatoData
- Popular
- Stališče
- mogoče
- Prispevkov
- pripravljeni
- Prisotnost
- predstavljeni
- prejšnja
- privilegiji
- verjetno
- problem
- Postopek
- Program
- Programerji
- pravilno
- protokol
- Namen
- hitro
- pripravljen
- pravo
- v realnem času
- prejetih
- nedavno
- Obnovi
- redni
- sprostitev
- zanesljiv
- ne pozabite
- daljinsko
- Remote Access
- poročilo
- Prijavljeno
- vrnitev
- vrne
- Tvegano
- soba
- Run
- Rust
- varna
- Varnost
- Enako
- Znanstvenik
- Zaslon
- drugi
- Varno
- varnost
- serijska
- Strežniki
- Storitve
- Zasedanje
- sej
- nastavite
- nastavitev
- nastavitev
- huda
- Shell
- Kratke Hlače
- Zaustavite
- Podoben
- Enostavno
- poenostavljeno
- Razmere
- skrivaj
- So
- Software
- trdna
- nekdo
- Nekaj
- vir
- hitrost
- konice
- Komercialni
- standardna
- stojala
- Začetek
- Še vedno
- močna
- predmet
- taka
- Predlaga
- podpora
- SVG
- sistem
- Bodite
- skupina
- terminal
- O
- Blok
- njihove
- Tukaj.
- zato
- stvari
- mislil
- 3
- čas
- krat
- Naslov
- do
- danes
- orodje
- Orodje
- orodja
- vrh
- Skupaj za plačilo
- sledenje
- Prehod
- pregleden
- sprožilo
- Težava
- Res
- Zaupajte
- OBRAT
- tipično
- unix
- Nadgradnja
- posodobljeno
- URL
- uporaba
- uporabnik
- navadno
- potrjevanje
- različica
- preko
- ranljivost
- hotel
- dobro znana
- Kaj
- medtem
- WHO
- pogosto
- bo
- okna
- brez
- bi
- pisati
- pisanje
- pisni
- let
- Vi
- Vaša rutina za
- zefirnet