- OpenSSH सर्वर
sshdमें signal handler race condition के कारण, authentication से पहले की समय-सीमाLoginGraceTimeके भीतर authenticate न करने वाला client default configuration वाले server पर remote code execution करा सकता है - यह vulnerability 2006 के CVE-2006-5051 की regression है, और अक्टूबर 2020 में OpenSSH 8.5p1 commit द्वारा
sigdie()से safeguard हटाए जाने के बाद 8.5p1 और उससे ऊपर, लेकिन 9.8p1 से कम versions में फिर से आ गई - glibc-आधारित Linux में
syslog()malloc()·free()जैसे async-signal-unsafe functions को call करता है, जिससे unsandboxedsshdके privileged code में authentication के बिना root RCE हो सकता है - प्रयोग i386 virtual machine और लगभग 10ms packet jitter वाले स्थिर network पर किए गए; Debian 12.5.0 OpenSSH 9.2p1 में औसतन लगभग 10,000 attempts लगे और
MaxStartups=100,LoginGraceTime=120conditions में root shell तक पहुँचने में लगभग 6–8 घंटे लगे - OpenSSH ने 6 जून 2024 को commit
81c1099से इसे fix किया; यदि update या recompile करना कठिन हो, तोLoginGraceTime 0से RCE रोका जा सकता है, लेकिन MaxStartups connection exhaustion DoS का जोखिम बना रहता है
vulnerability कहाँ पैदा होती है
- OpenSSH
sshdकी समस्या authentication से पहले चलने वाले SIGALRM handler से शुरू होती है- यदि client
LoginGraceTimeके भीतर authenticate नहीं करता, तोSIGALRMhandler asynchronously call होता है - यह handler
syslog()जैसे ऐसे functions को call करता है जो async-signal-safe नहीं हैं - default value
LoginGraceTime=120seconds है, और पुराने OpenSSH versions में यह 600 seconds थी
- यदि client
- यह vulnerability CVE-2006-5051 की regression है
- CVE-2006-5051, 2006 में Mark Dowd द्वारा report की गई OpenSSH 4.4 से पहले की signal handler race condition है
- अक्टूबर 2020 में OpenSSH 8.5p1 के commit
752250cने गलती सेsigdie()से#ifdef DO_LOG_SAFE_IN_SIGHANDहटा दिया
- version के हिसाब से impact range साफ़ अलग-अलग है
- OpenSSH 4.4p1 से कम: यदि CVE-2006-5051 या CVE-2008-4109 से जुड़े patches backport नहीं किए गए हैं, तो vulnerable
- OpenSSH 4.4p1 और उससे ऊपर, लेकिन 8.5p1 से कम:
sigdie()को safe_exit(1)call में बदल दिया गया था, इसलिए इस race condition के लिए vulnerable नहीं - OpenSSH 8.5p1 और उससे ऊपर, लेकिन 9.8p1 से कम: safeguard हटने से फिर vulnerable
प्रभावित environments और exceptions
- remote exploitation का target glibc-आधारित Linux है
- glibc का
syslog()internallymalloc()औरfree()जैसे async-signal-unsafe functions को call करता है - vulnerable code
sshdके privileged code में है, sandboxed नहीं है और full privilege के साथ run होता है - नतीजतन authentication के बिना remote root code execution संभव है
- glibc का
- अन्य libc या operating systems investigation में शामिल नहीं थे
- OpenBSD vulnerable नहीं है
- OpenBSD का
SIGALRMhandlersyslog()के बजायsyslog_r()call करता है syslog_r()OpenBSD द्वारा 2001 में बनाया गया async-signal-safer version है
- OpenBSD का
remote exploitation research की assumptions
- remote से इस race condition को exploit करने के लिए तीन समस्याएँ हल करनी होती हैं
- ऐसा code path चाहिए जो
SIGALRMके सही समय पर बीच में आने परsshdको inconsistent state में छोड़ दे - उस code path तक पहुँचना और सही समय पर interruption होने की probability बढ़ानी होगी
- remote network environment में भी वह timing match करनी होगी
- ऐसा code path चाहिए जो
- research की शुरुआत सीधे modern protections से भिड़ने के बजाय पुराने OpenSSH के i386 environment से हुई और फिर recent versions तक expand की गई
- experimental conditions की साफ़ limitations हैं
- target bare-metal server नहीं, केवल virtual machines थे
- network लगभग 10ms packet jitter वाला relatively stable link था
- exploit के कई parts और बेहतर किए जा सकते हैं
- amd64 exploit पर काम शुरू हुआ, लेकिन मजबूत ASLR की वजह से यह काफी कठिन है
पुराने OpenSSH targets पर experiments
-
Debian 3.0r6, OpenSSH 3.4p1
- target
SSH-2.0-OpenSSH_3.4p1 Debian 1:3.4p1-1.woody.3है, जो Debian 3.0r6 का 2005 का environment है - यह Debian version privilege separation को default रूप से enable करने वाला पहला Debian version था, और उस समय के major vulnerability patches लागू थे
- exploitation
free()interruption और heap inconsistent state का उपयोग करता है- public key parsing code के अंदर
free()call कोSIGALRMसे interrupt किया जाता है - इसके बाद
packet_close()के अंदर एक औरfree()में inconsistent heap state का उपयोग किया जाता है
- public key parsing code के अंदर
- glibc 2.2.5 में Solar Designer की
unlink()technique के खिलाफ hardening नहीं थी - attack
__free_hookको overwrite कर execution flow को heap में shellcode address पर बदलता है - इस Debian version में न ASLR है, न NX
- timing improvements के बाद औसतन लगभग 10,000 attempts की जरूरत पड़ी
MaxStartups=10,LoginGraceTime=600conditions में remote root shell तक पहुँचने में औसतन लगभग 1 सप्ताह लगा
- target
-
Ubuntu 6.06.1, OpenSSH 4.2p1
- target
SSH-2.0-OpenSSH_4.2p1 Debian-7ubuntu3है, जो Ubuntu 6.06.1 का 2006 का environment है - यह आखिरी Ubuntu version है जो अभी भी CVE-2006-5051 के लिए vulnerable है
- glibc 2.3.6 malloc-family functions में प्रवेश करते समय mandatory lock लेता है, इसलिए malloc interruption के बाद दूसरे malloc call को exploit करने का तरीका deadlock में बदल जाता है
- अंतिम exploitation path PAM का उपयोग करता है
pam_start()sshdका globalsshpam_handlepointer set करता है- यदि
_pam_add_handler()interrupt हो जाए, तो uninitializednextfield रह सकता है - जब
pam_end()SIGALRM handler में call होता है, तो arbitrary pointer कोfree()में pass किया जा सकता है
- glibc की पुरानी
unlink()technique blocked थी, इसलिए Malloc Maleficarum के House of Mind fastbin version का उपयोग किया गया - fake arena को
sshdके.got.pltकी ओर point कराया गया और_exit()entry को heap shellcode address से overwrite किया गया - इस Ubuntu का heap default रूप से executable है
- औसतन लगभग 10,000 attempts की जरूरत पड़ी
MaxStartups=10,LoginGraceTime=120conditions में remote root shell तक पहुँचने में औसतन लगभग 1–2 दिन लगे- बदकिस्मत attacker root shell पाने से पहले सभी 10
MaxStartupsconnections को deadlock करा सकता है
- target
Debian 12.5.0, OpenSSH 9.2p1 experiment
-
syslog()और glibc malloc path- target
SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2है, जो Debian 12.5.0 का 2024 current stable environment है - यह environment CVE-2006-5051 regression के लिए vulnerable है
- इस version का
SIGALRMhandlerpacket_close()याpam_end()call नहीं करता, बल्किsyslog()path की ओर जाता हैgrace_alarm_handler()sigdie()call करता हैsigdie()sshlogv()औरdo_log()से होकरsyslog()call करता है
- Debian glibc 2.36 का
syslog()पहली call पर malloc call करता है__localtime64_r()path में__tzfile_read()call होता हैfopen()FILE structure के लिएmalloc(304)call करता है- internal read buffer के लिए
malloc(4096)भी call करता है
- glibc malloc अक्टूबर 2017 के बाद single-threaded situations में mandatory lock नहीं लेता
sshdजैसे single-threaded process में malloc race exploitation की संभावना बनती है
- target
-
ASLR conditions और i386 constraints
- Debian 12.5.0 i386 environment में ASLR weakness है
sshdका PIE, heap, अधिकांश libraries और stack आम तौर पर randomized होते हैं- glibc खुद हमेशा
0xb7200000या0xb7400000पर mapped होता है - glibc address को 50% probability से hit किया जा सकता है
- exploit assume करता है कि glibc
0xb7400000पर mapped है - क्योंकि यह address
0xb7200000से थोड़ा ज्यादा common था
-
heap inconsistency और FILE structure exploitation
- चुना गया malloc path एक बड़े free chunk को दो हिस्सों में बाँटने वाला split path है
- एक returned chunk और remainder chunk बनता है
- यदि
SIGALRMremainder chunk के unsorted list में जुड़ने के बाद, लेकिन size field initialization से पहले बीच में आ जाए, तो heap inconsistency पैदा होती है - attacker पिछले heap allocation के residual data के जरिए remainder chunk के size field को control करता है
- remainder chunk को वास्तविक से बड़ा बनाकर दूसरे heap chunk से overlap कराया जाता है
- SIGALRM handler के अंदर malloc इस chunk का उपयोग करता है और heap memory corrupt होती है
- target
__tzfile_read()के अंदरfopen()द्वारा heap पर allocate किया गया FILE structure है- limited heap corruption से FILE structure के
_vtable_offsetका 1 byte overwrite किया जाता है - glibc libio function vtable pointer को default location के बजाय किसी और offset पर ढूँढता है
- attacker उस location के fake vtable pointer और
_codecvtpointer को पिछले heap allocation के residual data से control करता है
- limited heap corruption से FILE structure के
- i386 glibc में इस technique से
__fread_unlocked()के दौरान arbitrary function pointer__fctcall किया जा सकता है - amd64 glibc में
_vtable_offsetइस्तेमाल नहीं होता प्रतीत होता है
-
heap layout और 27 race windows
- केवल एक small race window से race condition जीतना कठिन होने के कारण, 27 pairs of large hole and small hole बनाए गए
- 28 pairs
PACKET_MAX_SIZE256KB से ज्यादा हो जाते हैं - final packet
malloc(~4KB), malloc(304), malloc(~4KB), malloc(304)sequence को force करता है - यदि हर large hole split सही moment पर interrupt हो, तो SIGALRM handler का
fopen()corresponding small hole को FILE structure के रूप में allocate करता है - heap layout बनाने के लिए
sshdके public key parsing code का उपयोग किया गयाcert_parse()औरcert_free()paths से लगभग arbitrarymalloc()औरfree()sequence perform किया गया- memory leak न मिलने के कारण tcache chunk को temporary barrier chunk के रूप में इस्तेमाल किया गया
- पाँच तरह के public key packets भेजे गए
- a/ uncontrollable heap allocation को tcache chunk में जाने दिया
- b/ 27 pairs of large/small holes और barrier chunk बनाए
- c/ fake header, fake footer, fake vtable,
_codecvtpointer लिखे - d/ लगभग 256KB की बड़ी string allocate और free कर holes को unsorted list से संबंधित malloc bins में move किया
- e/ final malloc sequence force कर 27 small race windows खोले
-
modern version के लिए timing strategy
- पुराने versions में इस्तेमाल की गई feedback-based timing strategy OpenSSH 9.2p1 target पर काम नहीं आई
- पाँचवें public key parsing में लगभग 10ms लगते हैं, जिससे large race window बहुत बड़ा हो जाता है
- OpenSSH 7.8p1 में introduce किया गया
user_specific_delay()response को अधिकतम लगभग 9ms delay करता है, जिससे पुराने feedback खराब हो जाते हैं - नई strategy दो तरह के intentional error response times की तुलना करती है
- public key parsing से ठीक पहले error trigger करने वाला packet भेजा जाता है
- public key parsing के ठीक बाद error trigger करने वाला packet भेजा जाता है
- दोनों response times के अंतर से final public key parsing time measure किया जाता है
- इस strategy से औसतन लगभग 10,000 attempts में race condition जीती गई
MaxStartups=100,LoginGraceTime=120conditions में race condition जीतने तक औसतन लगभग 3–4 घंटे लगे- ASLR की वजह से remote root shell तक पहुँचने में औसतन लगभग 6–8 घंटे चाहिए
amd64 exploit की progress
- amd64 target Rocky Linux 9 रखा गया
- target image
Rocky-9.4-x86_64-minimal.isoहै - OpenSSH 8.7p1 इस signal handler race condition के लिए vulnerable है
- ASLR weakness के कारण glibc 2MB multiples पर mapped होती है, जिससे partial pointer overwrite और ज्यादा शक्तिशाली हो जाता है
- target image
- Rocky Linux 9 का glibc 2.34
syslog()internally__open_memstream()call करता है- heap पर FILE structure को
malloc()करता है calloc(),realloc(),free()भी call करता है, जिससे extra room मिलता है
- heap पर FILE structure को
- heap corruption primitive, heap पर allocate होने वाले दो FILE structures और glibc address के 21 fixed bits के आधार पर amd64 पर भी exploitation संभव माना गया
- estimated time i386 के 6–8 hours से लंबा है, लेकिन एक सप्ताह से कम की उम्मीद बताई गई
- Ubuntu 24.04 के बारे में अलग observation भी है
- Ubuntu 24.04
sshdchild की ASLR को re-randomize नहीं करता, बल्कि boot के समय केवल एक बार randomize करता है - कारण
rexec_flagको बंद करने वालेsystemd-socket-activation.patchतक traced है - आम तौर पर यह अच्छा विकल्प नहीं है, लेकिन इस vulnerability में SIGALRM handler के अंदर
syslog()पहलाsyslog()call नहीं है, इसलिए malloc functions call नहीं होते और exploitation रुकता है - संबंधित patch: https://git.launchpad.net/ubuntu/+source/…
- Ubuntu 24.04
patch और mitigations
- OpenSSH ने 6 जून 2024 को commit
81c1099से इस race condition को fix किया- 81c1099:
sshd(8)में problematic client behavior को penalise करने वाली functionality जोड़ी - async-signal-unsafe code को
sshdके SIGALRM handler से listener process में ले जाकर synchronously handle किया गया
- 81c1099:
- यह fix बड़े commit
81c1099और उससे भी बड़े defense-in-depth commit03e3de4पर आधारित है, इसलिए backport करना कठिन हो सकता है - यदि backport कठिन हो, तो
sshsigdie()से async-signal-unsafe code हटाया या comment out किया जा सकता है ताकि केवल_exit(1)call हो - यदि update या recompile संभव नहीं है, तो configuration file में
LoginGraceTimeको0set किया जा सकता है- यह setting इस advisory के remote code execution को रोकती है
- लेकिन सभी
MaxStartupsconnections exhaust होने वाले DoS के लिए vulnerable बना देती है
disclosure timeline
- 2024-05-19: OpenSSH developers से संपर्क किया गया, और उसके बाद patches व reviews का दौर चला
- 2024-06-20:
distros@openwallसे संपर्क किया गया - 2024-07-01: coordinated release date के रूप में public किया गया
1 टिप्पणियां
Hacker News की राय
दिलचस्प है कि RCE fix लगभग एक महीने पहले सार्वजनिक रूप से “मिला-जुला” कर डाला गया लगता है
जब PerSourcePenalties चालू होता है, तो sshd(8) authentication से पहले वाले child session process के exit status पर नज़र रखता है, और बार-बार authentication failure या sshd crash जैसी conditions को client address के लिए कुछ समय की penalty के रूप में record करता है
https://github.com/openssh/openssh-portable/commit/81c1099d2...
यह attacker को कुछ बता देने वाला reverse-engineer किया जा सकने वाला patch होने के बजाय, binary structure बदलकर किसी खास vulnerability को हटाने और उस पूरे exploit family को भी mitigate करने का side effect रखता दिखता है, इसलिए काफी clever लगता है
ऊपर वाला बदलाव garbage connections से निपटने के लिए पहले से घोषित feature था, और बस race condition जीतना कठिन बनाकर इस vulnerability को भी mitigate करता है
पिछली चर्चा: https://news.ycombinator.com/item?id=40610621
सोचता हूं कि क्या लोग thread का पहला comment ही पढ़कर upvote कर देते हैं और गलत impression लेकर चले जाते हैं
OpenSSH release notes का एक हिस्सा दिलचस्प है
“ASLR चालू होने वाले 32-bit Linux/glibc systems पर successful exploitation demonstrate किया गया है। lab conditions में attack के लिए server द्वारा allowed maximum तक लगातार connections को औसतन 6–8 घंटे बनाए रखना पड़ता है। माना जाता है कि 64-bit systems पर भी यह possible है, लेकिन अभी demonstrate नहीं हुआ है। ऐसे attacks के improve होने की काफी संभावना है।”
https://www.openssh.com/releasenotes.html
जिस diff [1] से bug आया, उसे देखने पर analysis के हिसाब से problem यह है कि
sigdie()पहले#ifdef DO_LOG_SAFE_IN_SIGHANDसे wrapped था, लेकिन refactor होकरsshsigdie()के सीधेsshlogv()call करने वाले रूप में जाते समय #ifdef छूट गयाइसे क्या रोक सकता था? क्या pull requests को और ज्यादा लोगों ने देखना चाहिए था? यह हैरान करने वाला है कि जिस software पर पूरी दुनिया secure access के लिए निर्भर है, उसे effectively दो लोग [2] maintain करते दिखते हैं
[1] https://github.com/openssh/openssh-portable/commit/752250caa...
[2] https://github.com/openssh/openssh-portable/graphs/contribut...
इस मामले में अगर comment होता कि
#ifdefक्यों जरूरी है, तो मदद मिल सकती थी। जैसे: “यहां का code async-signal-safe होना चाहिए, और lock state अनिश्चित हो सकती है”हालांकि ईमानदारी से कहें तो
getrlimitभी इस list में नहीं है: https://man7.org/linux/man-pages/man7/signal-safety.7.htmlफिर भी अगर async-signal-safety से जुड़ा comment लगा code हटाया या बदला गया होता, तो review में ध्यान जाने की संभावना थी। उद्धृत code में
SAFE_IN_SIGHANDजैसा नाम ही बस यह संकेत देता है कि इस code को signal handler के अंदर safe होना चाहिएsyslogfunction इस्तेमाल करने के लिए refactor कर दिया था, संभव है कि इस code के लेखक ने सरलता से मान लिया हो कि change safe हैवे भूल गए होंगे या उन्हें पता नहीं रहा होगा कि OpenBSD ssh developers जिन दूसरे platforms को वास्तव में support करने का दावा नहीं करते, उन पर अभी भी async-signal-unsafe functions इस्तेमाल होते हैं
open source developers से कुछ पाने का कोई अधिकार नहीं है। वे भी गलतियां कर सकते हैं, और कितने maintainers या reviewers रखने हैं, यह वे खुद तय कर सकते हैं
https://gist.github.com/richhickey/1563cddea1002958f96e7ba95...
#ifdefहटाने वालों जैसा न करनारिलीज़ नोट्स भी पढ़ने लायक हैं: https://www.openssh.com/releasenotes.html
यह असल में एक दिलचस्प signal race condition bug का variant है। vulnerability report के मुताबिक, “OpenBSD खास तौर पर vulnerable नहीं है, क्योंकि SIGALRM handler
syslog()के async-signal-safe versionsyslog_r()को call करता है, जिसे OpenBSD ने 2001 में बनाया था”यानी signal-safety mitigation ने OpenBSD developers को signal handler के अंदर non-trivial code डालने के लिए प्रेरित किया, और वही code दूसरे systems में port होने पर unsafe हो गया। अगर सामान्य समझ और Unix code conventions के मुताबिक signal handler के अंदर code को न्यूनतम रखने के लिए refactoring की गई होती, तो यह bug टल जाता
क्योंकि समय के साथ transitive calls में कहीं न कहीं async-signal-unsafe call मिल जाना बहुत आसान है, और यह भी हमेशा स्पष्ट नहीं होता कि वह path signal context से reachable है
अपने OpenSSH instances को upgrade करने के बाद, मैंने देखा कि वे glibc के बजाय musl से linked हैं, इसलिए मैंने जांचा कि musl का
syslog(3)भी allocation करता है या नहीं, और इसलिए क्या उसी तरह आसानी से exploit हो सकता हैदेखने में ऐसा नहीं लगता: https://github.com/bminor/musl/blob/master/src/misc/syslog.c
वहां सब कुछ stack पर है या lock के साथ re-entry रोकने वाले static variables हैं।
{d,sn,vsn}printf()calls भी musl में allocation नहीं करते, लेकिन glibc में कर सकते हैं। क्या मैं कुछ miss कर रहा हूं?फिर भी अगर
sigalrmके अंदर deadlock हो जाए तो connection cleanup रुक सकता है, जिससे denial of service हो सकता हैFreeBSD के लिए patch आ गया है
प्रभावित है या नहीं, यह स्पष्ट नहीं है। ज्ञात exploit सिर्फ glibc पर संभव था और FreeBSD glibc इस्तेमाल नहीं करता, लेकिन safe side पर रहना बेहतर है
https://www.freebsd.org/security/advisories/FreeBSD-SA-24:04...
report के मुताबिक, अगर आप sshd को update या recompile नहीं कर सकते, तो config file में
LoginGraceTimeको 0 set करने भर से यह signal handler race condition ठीक हो सकता हैइस case में sshd सभी
MaxStartupsconnections खत्म हो जाने वाले denial of service के लिए vulnerable हो जाएगा, लेकिन इस advisory में बताए गए remote code execution से सुरक्षित रहेगाइसलिए
sshd_configमेंLoginGraceTime 0set करना mitigation लगता हैतो क्या यह और भी खराब नहीं है?
Debian 12 के लिए patch आ गया है, और Debian 11 प्रभावित नहीं है
https://security-tracker.debian.org/tracker/CVE-2024-6387
apt updateऔरupgradeचलाया, और upgrade सिर्फ OpenSSH packages का हुआवाकई शानदार खोज है
मैं खुद सीधे इस काम में नहीं हूँ, लेकिन security research में अक्सर ऐसा माहौल महसूस होता है कि “जीतने” के लिए किसी एक समस्या को ढूँढकर ठीक करवाना या reward पाना काफी नहीं, बल्कि remote access तक पहुँचने वाली पूरी chain ढूँढनी पड़ती है
लगता है कि एक single hole, जैसे memory corruption का एक मामला या sandbox escape का एक मामला भी काफी होना चाहिए। आजकल छोटी-छोटी समस्याएँ इतनी ज्यादा हैं कि शायद लोगों से उन्हें सच में गंभीरता से लेने या bug bounty दिलवाने के लिए अंत तक जाने वाला hack दिखाना पड़ता है
उदाहरण के लिए, अगर कोई app गलत trusted input मिलने पर crash हो जाता है, लेकिन उस app की प्रकृति ऐसी है कि उसे किसी adversary के सामने expose करने का इरादा ही नहीं है और व्यवहार में ऐसा होने की संभावना भी नहीं है, तो ज्यादातर लोग इसे बस bug मानेंगे, security bug नहीं। इसे ठीक करना अच्छा होगा, लेकिन यह उसी स्तर की बात नहीं है, और ऐसी चीजें ढूँढना भी बहुत मुश्किल नहीं होता
इसलिए इस case जैसे “असली” security bug और security impact न रखने वाले bugs में फर्क करना जरूरी है, और यह साबित करना कि issue exploitable है बहुत महत्वपूर्ण है
security impact न रखने वाले bugs तो अंतहीन होंगे, इसलिए ऐसा proof माँगना जल्द खत्म होता नहीं दिखता
यह design से ही ऐसा है, और users lambda functions सहित कुछ भी serialize और deserialize कर सकते हैं। मेरी library का इरादा सिर्फ trusted sources के data को process करने का है
मेरी जानकारी में कोई भी इस library को untrusted data process करने के लिए इस्तेमाल नहीं करता। एक लोकप्रिय library config files पढ़ने के लिए मेरी library इस्तेमाल करती है, लेकिन वे config files को trusted data मानते हैं। और दूसरे लोग मेरी library कैसे इस्तेमाल करते हैं, इसे police करना मेरा काम नहीं है
ऐसी स्थिति में क्या मेरे project में remote code execution vulnerability है कहकर highest-priority CVE register करना सही होगा?
reward हमेशा पहली category को मिलता है। दूसरी category की reports, अगर proof of concept या exploitability proof न हो, तो उल्टा reputation या signal को नुकसान पहुँचा सकती हैं
जब तक कुछ खास conditions पूरी न हों, तब तक exploitable न बनने वाली weaknesses लगभग हमेशा मौजूद रहती हैं। Pwn2Own जैसी competitions में भी कई vulnerabilities को जोड़कर आखिर device takeover किया जाता है, और वे अक्सर सालों तक patch न होकर रह जाती हैं। researchers impact maximize करने के लिए ऐसी weaknesses को लंबे समय तक जमा करके भी रखते हैं
दुख की बात है, लेकिन reality यही है
OpenSSH release notes: https://www.openssh.com/txt/release-9.8
जो लोग upgrade नहीं कर सकते या नहीं करना चाहते, उनके लिए minimal patch: https://marc.info/?l=oss-security&m=171982317624594&w=2