456 points josemrb 1 hour ago 107 comments

rvz 1 hour ago | parent

pluc 1 hour ago | parent

A+ name

hypfer 1 hour ago | parent

A* name

kleiba2 1 hour ago | parent

A{256,} name

henry700 57 minutes ago | parent

*

bombcar 1 hour ago | parent

The real name of this is sshole - the is the "star" of the show, after all.

yreg 1 hour ago | parent

*sshole, the * is the star of the show

You can use \ to escape formatting.

illusive4080 1 hour ago | parent

From the other thread’s source [1], it affects musl without PAM. You can set PasswordAuthentication=no or update to remediate.

[1] https://hachyderm.io/@damienmiller/117563026759098135

hypfer 1 hour ago | parent

What is out there that uses musl without PAM and hosts an OpenSSH SSHd with PasswordAuthentication?

As in: "Actually out there"

The hypothetical Alpine exists, yes, but what runs that like that?

jbyers 1 hour ago | parent

A large number of Docker containers?

Edit: Sure, a small minority presumably run sshd under these conditions. But a small minority times the number of Alpine containers running in the world gets to a large absolute number.

Edit 2: You really don't need to look very hard to find public container examples at million-download scale.

hypfer 1 hour ago | parent

Docker containers that run sshds?

ekidd 1 hour ago | parent

Many, many Docker containers rely on "docker exec" or the kubectl equivalent to gain CLI access when needed. To have sshd in an Alpine Docker container, you're generally need to be running init and a bunch of demons, not just a single standalone service.

I'm guessing in practice relatively few people are actually exposed. But if they are, it's catastrophic.

stingraycharles 1 hour ago | parent

Docker containers run sshd?

Bender 1 hour ago | parent

What is out there that uses musl without PAM and hosts an OpenSSH SSHd with PasswordAuthentication?

Possibly public SFTP servers. I have allowed null passwords in the past for anonymous public SFTP and I run Alpine Linux exclusively for my servers both VM's and physical. The shadow package (PAM) did not get installed by default. I installed it but I had to specify it in the installation so there are likely people without it. There is probably a way to find them on shodan.io.

I will activate one for people to play around with:

    sftp hn@ping.altchan.org
There's no firewall and no password. Hack away HN.

    PasswordAuthentication yes
    PermitEmptyPasswords yes

figassis 52 minutes ago | parent

Agent sandboxes today probably

gosen 1 hour ago | parent

I really like creativity in the name, the way website built and the content

"tl;dr" was a bit of a downgrade though, but that's fine

it's a nice way to promote the company behind it

neuroticnews25 1 hour ago | parent

That's a well-made site, yet I feel nothing.

cpach 1 hour ago | parent

LLM output fatigue?

riffraff 41 minutes ago | parent

I didn't hate the writing even if it's AI, but I deeply disliked the animations. I don't know if that's LLM fatigue or not.

amelius 27 minutes ago | parent

Apple sideways traffic light fatigue.

hagbard_c 21 minutes ago | parent

Good to know I'm not the only one annoyed by that superfluous piece of ${whatever} signalling.

jonstewart 1 hour ago | parent

What is dead can never die. All blueteamers are ironborn these days.

tasuki 55 minutes ago | parent

Maybe that's on you though. I enjoyed it, though the discrepancy between the `*sshole` name and the `sshhole.com` domain made me twitch. How is anyone[0] obsessive enough to find this and write it up and yet not obsessive enough to make the amount of `h` consistent?

[0]: Be they human or LLM. Or an entity with any proportion of the two. I do not judge nor discriminate.

glibg10b 49 minutes ago | parent

Look closely. The second h is behind the word and almost as dark as the background

tasuki 45 minutes ago | parent

Oh. Thank you!

oneeyedpigeon 17 minutes ago | parent

I thought it was a great write up. It did feel a bit AI-coded, but whether it actually was or not, it's still a good bit of work imo.

phyzome 11 minutes ago | parent

I dunno, there were some strange discrepancies in the explanation (and captions). Didn't really hang together.

xnorswap 3 minutes ago | parent

It would be weird to spend this much effort doing the site by hand, for a bug that the author says was found by a swarm of agents.

cube00 1 hour ago | parent

> except a lot of programs never check for NULL. they just compare whatever crypt() gives back with the stored field, hit the NULL, and crash

> so musl (the libc under alpine) goes ok fine, crypt() just won't return NULL anymore. if it fails, it returns a single character instead.

Considering it's been accepted that crashing if malloc returns a NULL is your fault, did musl really feel the need to accommodate bad implementations like this or is this just AI speculation?

Good4boothee 50 minutes ago | parent

> did musl really feel the need to accommodate bad implementations like this

I don't know about this specific case but in general? Yes, totally. No one is going to fix all existing software that depends on libs behaving exactly as glibc, you have to accept some trade-offs. Either your new implementation stops being perfectly simple and clean, or no one uses it.

Palomides 9 minutes ago | parent

it's not "glibc behavior", returning null on error is in the spec

red75prime 49 minutes ago | parent

"unfortunately, a large portion of programs which call crypt are not prepared for its failure and do not check that the return value is non-null before using it. thus, always "succeeding" but giving an unmatchable hash is reportedly a better behavior than failing on error." [1]

[1] https://git.musl-libc.org/cgit/musl/commit/?id=b3c4cc121f70f...

afc 26 minutes ago | parent

Such a questionable decision! "Rather than let a bug in a caller (not handling the valid null output and thus crashing) surface, let's just silence it and pretend that the caller is correct! A potential clash in some situations (resulting in this vulnerability) is better than a crash!"

Maybe I should update my plea to fail loudly (https://alejo.ch/3gk) to list this as an example.

01HNNWZ0MV43FF 15 minutes ago | parent

It's always a people problem. Doing a bad patch on my side is easier than bothering anyone else to fix their code

jdw64 1 hour ago | parent

I liked that this site explained the vulnerability in an easy-to-understand way.

ordu 45 minutes ago | parent

I can't understand it. All this scrolling and pictures are distracting me, can't concentrate really.

jdw64 40 minutes ago | parent

I think it varies from person to person. Since I'm kind of from the TikTok generation, I don't have much trouble reading this kind of animation, but some people prefer static sites. That's just how it is.

I also found scroll-triggered animations hard to read at first, but these days a lot of sites use them, so I've gotten used to them.

vavkamil 23 minutes ago | parent

Yep, scrolling through my phone and reading slowly to understand. I'm seeing distracting animations below what I'm reading. And when I go to them, there is no way to restart them. So it completely misses the point.

sneela 1 hour ago | parent

Yet another clankered finding creating a clankered website with clankered explanations. To be fair, this one's a lot better than the other clankered equivalents, but I wonder whether these people even know enough about their bug to have their own write-up?

Also, what's with this damn trend of typing in lowercase only? Why is this a thing?

> oh did i say "i"? sorry. i had agent swarms. a lot of them. let's not get into it

Still a cool finding... it's just the communication is becoming a lot worse these days - I want to understand the findings please, not be impressed by your webpage! Biggest gripe in recent memory is https://github.com/xoreaxeaxeax/skitter-creek-bath-salts

BugsJustFindMe 52 minutes ago | parent

> Also, what's with this damn trend of typing in lowercase only?

Anticapitalism.

account42 11 minutes ago | parent

Anticapitalism that uses an army of clankers?

dsunds 9 minutes ago | parent

You made my morning. Got a new dad joke.

lclc 1 hour ago | parent

One more reason to build your (own) Docker images on 'FROM scratch' (basically nothing).

blueflow 58 minutes ago | parent

No, the Alpine containers don't come with sshd preinstalled. You'd have to manually install via dockerfile and leave it unconfigured.

Good4boothee 48 minutes ago | parent

No one runs sshd in containers, at least I hope so. What would even be the point when you have docker/kubectl commands available?

ChrisRR 1 hour ago | parent

Can we just have a site with the text and images without the awkward scrolling crap? Hijacking basic features is an instant click away from sites for me

Edit: It seems to work fine on mobile. I'm not sure why the scrolling behaviour was added on the desktop version of the site

nxobject 1 hour ago | parent

Above all, I’m a little sad that the musl developers decided to make a lot of “well it’s convenient” changes to core crypto functions — at least without the level of auditing that would have caught this! It’s tarnished their reputation in my eyes a little.

rustyhancock 48 minutes ago | parent

I think everyone is over fixated on AI finding complex bugs beyond a typical person's understanding either to locate or exploit.

I think for any one of those bugs there might simply be half a dozen footguns or bugs that once it's spelled out you wonder how anyone let it slide.

I think that's the case where LLMs might indentify most.

It's challenging though as the current AI audits produce so many false positives it's hard to know when it's being pedantic or when it's genuinely caught a human being a bone head

jamal-kumar 21 minutes ago | parent

Finding more and more that these complex bugs people gloss over like you are now are being used in exploit chains and the end result is still my clients getting hacked

semiquaver 44 minutes ago | parent

A little?!? I’m sorry, but musl is a joke, this is yet another proof of that fact, and I have no idea why anyone uses it in production, they have only themselves to blame after the many warning signs.

trebligdivad 43 minutes ago | parent

In many ways each individual decision makes some sense; wanting to stop loads of programs being affected by a (remotely triggerable?) crash wanting to avoid time based attacks wanting to be able to set accounts to not have a password

Each one relies on a perfectly valid argument - that * can't match because we all know it'll be rejected by the other thing.

Retr0id 32 minutes ago | parent

> Each one relies on a perfectly valid argument - that * can't match because we all know it'll be rejected by the other thing.

But that's not a perfectly valid argument, and it never was.

zarzavat 30 minutes ago | parent

The real problem here is the C language. Our industry should have dumped it a long time ago and we’re now paying the price of prevarication.

01HNNWZ0MV43FF 20 minutes ago | parent

There is no industry, it's just people

oneeyedpigeon 18 minutes ago | parent

Which of the several flaws in this bug chain would have been materially different with a language other than C?

dmantis 15 minutes ago | parent

Wouldn't Rust's Result or Go's error checking prevent that?

While not mandatory, a person would probably use it instead of the * hack.

Simply because the calling side wouldn't have an option to forget the check like with the NULL case

ninkendo 2 minutes ago | parent

[delayed]

nh2 11 minutes ago | parent

Any use of sum types would have prevented this immediately.

The whole thing exists because APIs that return a NULL value that "nobody checks", plus a string that you shouldn't use if you actually did check the null value.

In languages with sum types, this cannot happen.

Either you get your hash, or no result at all. You couldn't get eg NULL and *.

win311fwg 2 minutes ago | parent

> In languages with sum types, this cannot happen.

Funny, C has sum types (disjointed union is a sum type) and it still happened.

The use of sum types may have helped, especially when combined with a tag which is trivial to do in C, but a language having sum types does not imply that the authors will use them.

muvlon 7 minutes ago | parent

C's lack of all of

- sum/union types

- multiple return values/tuple types

- exceptions

means that most ways of returning an error from a function are not available in C. Because of this, many C APIs, including `crypt` in this case, resort to in-band error signalling by using a sentinel value (like NULL, a negative integer, "*" etc.).

Most other languages lack one or two of the above, but very few lack all three, and so most have developed a different culture around error reporting (Result in Rust, multiple return values in Go, exceptions in Java, Python etc.).

K0nserv 4 minutes ago | parent

For the other part of the issue (the truncation in SHA512), in Rust you could've had:

    struct Input<'a>(&'a [u8]);
    

    impl<'a> Input<'a> {
      fn new(input: &'a [u8]) -> Result<Self, Error> {
        if input.len() >= 256 {
           return Err(Errro...);
        }
        
        Ok(Self(input))
      }
    }
Now the truncation is a terrible idea in the first place, but at least with this it would have been entirely obvious to the caller that it was there.

yangm97 13 minutes ago | parent

I would be more concerned about the lack of explicit return types, one of the arguments for strongly typed languages is that you should not have ambiguous data and yet…

Granted I mostly work with high level programming languages so I may be missing something.

WesolyKubeczek 2 minutes ago | parent

You must be new here. While I applauded the idea of musl when it first came out (coincidentally, glibc wasn't having the best time in its development then), the developer's arguments why <some behavior drastically different from every libc under the sun> was akchyually correct, which was why you had to fix a program that hadn't been broken for 30 years and now suddenly was, made me put him under the "clowns" category and never look at musl seriously again.

When later it turned out that musl's procrustian stack size made Python not really runnable under it, it cemented my resolve to not go near musl.

And now we have this.

scandinavian 1 hour ago | parent

Did anyone get it to work? I tried on the official alpine docker image, enabled password login for root. The shadow entry has ! as password by default, this didn't work with a > 256 character password (i also did passwd -l which also does !). I manually changed it to * and it still didn't work.

Am I doing anything wrong here?

OpenSSH_10.3p1, OpenSSL 3.5.9 29 Sep 2026

PRETTY_NAME="Alpine Linux v3.24"

atmosx 44 minutes ago | parent

Nope, wasn’t able to reproduced it in my firecracker VM, which isn’t publicly accessible anyway.

emayljames 42 minutes ago | parent

Did you try one incorrect standard password fail first?

f311a 37 minutes ago | parent

As far as I understand, it wont work on default setups. You need musl-c, no pam and openssh.

zamadatix 15 minutes ago | parent

In Alpine, these would all be the case for an out of the box install with openssh added unless you specifically install openssh-server-pam and configure sshd_config to use PAM (Alpine is already musl-c based and doesn't default to PAM).

q3k 30 minutes ago | parent

Also didn't have much luck on Alpine 3.20.10 with OpenSSH_9.7p1 which I've freshly installed from an official ISO.

Last two entries in /etc/shadow:

    test:*:20762:0:99999:7:::
    q3k:$6$snip.GgDQNTrqqX.A0:20762:0:99999:7:::
SSHing into test@ with one 'wrong' password then one 'long' password doesn't work. I have UsePAM no and PasswordAuthentication yes in my sshd_config.

hagbard_c 23 minutes ago | parent

No, didn't work for me open OpenWRT x64 running in a container but that is probably 'cause I'm using dropbear instead of openssh-server. That's what OpenWRT uses by default so the impact there will be minimal assuming that most installations don't change to openssh-server - it isn't installed by default.

markuman123 3 minutes ago | parent

It's because alpine has updated all openssh-server packages already. Even from EOL alpine versions.

henry700 58 minutes ago | parent

at this point my only reaction is "are you fucking kidding me"

RVuRnvbM2e 52 minutes ago | parent

Wait so musl, famously a stickler for standards, just changed the behaviour of a POSIX function?

draxen 51 minutes ago | parent

I avoided using alpine-based containers ever since finding out a lot of Linux server software is actually Linux + SystemD software. The union set API of both Linux and SystemD seems to be the default "Linux API" today.

sam_lowry_ 48 minutes ago | parent

I use alpine-based containers whenever I can just to keep the world safer from SystemD rotting Linux.

Never enabled sshd there... except on my PostmarketOS PineBook Pro... oh shit!

andunie 43 minutes ago | parent

What is the argument against systemd?

Is it mainly that it is too big?

I feel like everybody still loves the unix philosophy, but the previous tools were too bad, systemd just filled user demand for easier tools.

The moment someone makes a pid 1 software that is good and still modular, open and pluggable I think that will be an instant success.

stogot 48 minutes ago | parent

Of all the named vulnerabilities, I appreciate the history lesson and screenshots of how it got there

oefrha 48 minutes ago | parent

This is a super duper annoying site for people who just want to know if their systems are vulnerable, after patching like a dozen critical vulnerabilities in other software over the last week and are almost at the breaking point of resigning.

Can we have a “don’t treat me like five/toddler” / “idgaf about the explanation” quick link to a section for adults who need to patch systems?

(And if your reaction is “just scroll down, stupid”, I’m happy to report that with the scroll jacking, I scroll not enough / past the critical sections nine out of ten times.)

Edit: You may want to read https://sshhole.com/#exposure.

rmunn 40 minutes ago | parent

Thanks for mentioning that before I tried to scroll down. Forewarned, I was able to click on the "2026" link once the left-handed "scrollbar" (not the right word but I can't figure out what the right word should be) appeared, which let me jump past most of the verbiage and get to the "are you affected?" section just a couple pages later.

jamal-kumar 23 minutes ago | parent

It's people like you I fire with glee

traceroute66 47 minutes ago | parent

To be fair, I have less than zero sympathy for anyone who runs SSH on any platform without `PasswordAuthentication=no` in 2026.

Its not asking for trouble, it is there will be trouble, not if but when.

As for the people who say "well, I run SSH on port 942329053052". Well guess what, the bots make short work on that. We tried it at $work as an experiment, multiple bots found it in less than a couple of hours. That's why your SSH config must be hardened, preferably running on a hardened OS too.

znnajdla 42 minutes ago | parent

This particular bug works even with password authentication turned off.

traceroute66 39 minutes ago | parent

> This particular bug works even with password authentication turned off.

Does it ?

Somebody here has already said "You can set PasswordAuthentication=no or update to remediate"

We don't use musl at $work anyway, so I've no means to test.

sjamaan 33 minutes ago | parent

Where did you get that idea? The entire bug is about password hashing. With password auth off, that's not even attempted.

tialaramex 31 minutes ago | parent

Bug > are password logins still on? they are by default

You > This particular bug works even with password authentication turned off.

No. The bug is related to password authentication. If you do not have password authentication then you are not affected.

What freaks some people out is they chose parameters where they do have password authentication but they expect to always fail. That's a bad choice, like OK you did fit a cheap manual keyhole, but you threw the keys away thinking now nobody can open that - you realise somebody with a cheap jiggler can open it right ?

ghm2180 39 minutes ago | parent

100% and with local tool calls many AI systems will do ssh "for you" and end run around any security theatre that you may have going on with LLMs.

Ecco 27 minutes ago | parent

How is password auth weaker than key auth? Bugs in auth code can happen in both pathways. And apart from stupidly short passwords both should be equally impossible to brute-force.

In other words, conceptually, at the end if the day, isn’t a key just another name for a password, really?

Borealid 12 minutes ago | parent

What people think of as a very strong password often has <100 "security bits" of entropy.

Keys are usually at least 128 bits of entropy, and it's easy to take them up to 256.

Yes, both are a shared secret, but password auth - even with challenge-response - is weaker than key auth exactly because key auth provides more guess resistance.

scotty79 6 minutes ago | parent

2^100 is a lot of things to try though

jandrese 1 minute ago | parent

Especially if you have Fail2Ban set up.

throooooo 45 minutes ago | parent

The bugs and commits that "fix" them reveal somewhat of a shitshow for how musl is managed. All projects have bugs, but I can't help but question why the wheel was reinvented here. Many toes have been stubbed along the way.

BoppreH 43 minutes ago | parent

In-band signaling[1] strikes again. * should not have been used as special value, neither for "no password" in /etc/passwd nor "error while hashing the password" in crypt. I'm afraid we'll find many more of these abuses, specially in string manipulations. The null was ok, an exception (or equivalent) better, and Result<T> (or equivalent) best.

[1] https://en.wikipedia.org/wiki/In-band_signaling#Computer_dat...

wolrah 11 minutes ago | parent

Also how many times do we have to learn that letting badly programmed software die when unexpected things happen is the better option because it means people actually notice that there's a problem. Silent compatibility hacks are the worst, they guarantee problems never get fixed and the stack of hacks never gets smaller.

Microsoft has historically been one of the leaders on the wrong side of this one, but they have also demonstrated how effective it is to call out badly behaved software and make it annoy the users with UAC. When Vista came out, so many applications needed elevated privileges to run because they were badly designed to write user data in system locations, but now their application was more annoying to use and came with a scary dialog about it making changes to your computer that other better-designed software didn't get.

More often than not if a program didn't actually intend to change system settings it was just a matter of badly chosen default paths which are pretty trivial to fix, but so many vendors just would not do it despite years of complaints from NT admins wanting to not have to spend hours with Process Explorer figuring out specific permissions to grant limited users enough access. Once their failures were put front and center, calling their application out as the one getting things wrong every time the user ran it, they suddenly had motivation to fix it.

throw10920 7 minutes ago | parent

This is a side-effect of Unix-y "it's all plain text" design that leans extremely heavily upon in-band signalling (among other design decisions).

If /etc/shadow was a JSON (or XML, even, although that would make me feel gross), this bug would have been much easier to see, because a field that reads '"hash": ""' sticks out a lot* more than a custom microformat that you don't understand.

With data structures, there's never "plain text" - it's all structured. The question is whether you want to use existing formats and tools, or create a new one for every tool and literally make footguns like this.

paaloeye 42 minutes ago | parent

Not the worst site, but it's clearly a publicity machine from wakefield.co, whom I haven't heard of. Also, exploitation conditions are super narrow, albeit, any password is wild.

NavinF 41 minutes ago | parent

Wow. I wonder which of the common fuzzers would have found this a decade ago. If literally any password over 256 chars works, that means nobody has ever fuzzed openssh on musl linux

philipwhiuk 35 minutes ago | parent

Magic characters are awesome.

ctrlaltdileep 33 minutes ago | parent

That's kind of shocking. I guess the swarm of AI related vulnerability findings continues.

0x0 31 minutes ago | parent

For OpenWRT, AsusWRT etc, I believe they use dropbear ssh by default instead of OpenSSH, which apparently isn't affected?

dhx 6 minutes ago | parent

Yes, correct for OpenWrt. OpenWrt defaults to dropbear for both server and client. However, more advanced users may optionally choose to replace it with OpenSSH, or install OpenSSH side-by-side, to gain additional features of OpenSSH.

  > root@OpenWrt:~# cat /etc/openwrt_release | grep DISTRIB_RELEASE
  > DISTRIB_RELEASE='25.12.6'

  > root@OpenWrt:~# which ssh
  > /usr/bin/ssh
  > root@OpenWrt:~# ssh -V
  > Dropbear v2025.89
  > root@OpenWrt:~# ldd /usr/bin/ssh
  >  /lib/ld-musl-aarch64.so.1 (0x7f8e120000)
  >  libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x7f8e0b8000)
  >  libc.so => /lib/ld-musl-aarch64.so.1 (0x7f8e120000)

  > root@OpenWrt:~# which dropbear
  > /usr/sbin/dropbear
  > root@OpenWrt:~# dropbear -V
  > Dropbear v2025.89
  > root@OpenWrt:~# ldd /usr/sbin/dropbear
  >  /lib/ld-musl-aarch64.so.1 (0x7fbb900000)
  >  libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x7fbb898000)
  >  libc.so => /lib/ld-musl-aarch64.so.1 (0x7fbb900000)

  > root@OpenWrt:~# apk search openssh
  > openssh-client-10.6_p1-r2
  > openssh-client-utils-10.6_p1-r2
  > openssh-keygen-10.6_p1-r2
  > openssh-moduli-10.6_p1-r2
  > openssh-server-10.6_p1-r2
  > openssh-server-pam-10.6_p1-r2
  > openssh-sftp-avahi-service-10.6_p1-r2
  > openssh-sftp-client-10.6_p1-r2
  > openssh-sftp-server-10.6_p1-r2
  > openssh-sk-helper-10.6_p1-r2

MarkBlah 26 minutes ago | parent

Haha insane, great find and write up

shaolinspirit 21 minutes ago | parent

came for the name, stayed for the story

littlecranky67 9 minutes ago | parent

> how did I ran into it? [...] i had agent swarms. a lot of them. let's not get into it

Can we please now normalize AI usage in development? Just some other day people asked for "NO AI used" badges for software as measure for quality, and praised i.e. NetBSD for being AI-free. Yes, we come from a phase of AI slop, but it has become obvious that there are plenty of legit usecases where AI beats human-only effort nowadays.

HackerThemAll 6 minutes ago | parent

I just created an Alpine container, did "apk add openssh" and this doesn't work for me. I assume it's been updated already.

tomaskafka 5 minutes ago | parent

At this point it feels to me we aren’t discovering security bugs but a decade of planted backdoors.

sidneythekidney 2 minutes ago | parent

Fun!

I was able to reproduce this on Alpine 3.23.7 with OpenSSH_10.2p1.

Luckily PermitRootLogin [0] hasn't defaulted to yes since 2015 [1]. I'm guessing that's at least part of why this went undiscovered for so long.

0: https://man.openbsd.org/sshd_config#PermitRootLogin 1: https://cvsweb.openbsd.org/diff/src/usr.bin/ssh/sshd_config?...

DonHopkins 1 minute ago | parent

[delayed]