首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 归档 标签 关于

一个 * 和 257 个 A:SSHhole 全链分析

摘要

漏洞描述 openssh在2026年11月06日发布更新,在security更新中称修复了一个密码身份验证绕过漏洞 CVE编号为CVE-2026-123158,在NVD中漏洞描述为 在 Linux 系统上,OpenSSH 10.6p2 之前的版本中,当使用 musl libc 库且未启用 PAM 时,sshd 服务缺少针对密码认证绕过漏洞的变通方案(该漏洞源于对字符串是否为密码哈希的错误识别)。对...

openssh tar OpenSSH PAM docker 280 include int Linux 6p2
2026-11-09 1 阅读 约6分钟阅读 先知社区
分享:
字号:
漏洞描述opensh在2026年11月06日发布更新,在安全更新中称修复了一个密码身份验证漏洞CVE编号为CVE-2026-123158,在NVD中漏洞描述为在Linux系统上,OpenSSH 10.6p2之前的版本中,当使用musl libc库且未启用PAM时,sshd服务需要针对密码验证漏洞的变通方案(该漏洞源自对字符串是否为密码解密的错误识别)。对于某些账户配置,任何长度在256到1024个字符之间的密码都成功验证。Alpine Linux就是一个使用musl libc库且未启用PAM的平台示例。环境搭建检查docker版本下面使用的docker为29.1.3版本 docker --version docker ps >/dev/null && echo docker-ok创建工作目录下载源码分别下载openssh-10.6p1,以及openssh-10.6p2版本的源码并为v in 10.6p1 10.6p2进行校验;执行curl -sL --max-time 280 -o openssh-$v.tar.gz \ "https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-$v.tar.gz" \ || curl -sL --max-time 280 -o openssh-$v.tar.gz \ "https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-$v.tar.gz" gzip -t openssh-$v.tar.gz && echo "$v完整下载" did sha256sum openssh-10.6p*.tar.gz # 应与§1的两个值一致创建配置文件 sshd_config.lab 注意:不要写 UsePAM no ——未编译 PAM 的 sshd 会因“Bad 配置选项”拒绝启动 cat > sshd_config.lab <<'EOF' Port 2222 ListenAddress 0.0.0.0 HostKey /opt/ssh/etc/ssh_host_ed25519_key HostKey /opt/ssh/etc/ssh_host_rsa_key PasswordAuthentication yes KbdInteractiveAuthentication no PermitRootLogin yes PidFile /tmp/sshd.pid LogLevel DEBUG1 EOF crypt_probe.c 在musl中,系统不存密码明文,存的是crypt(pass,salt)的结果,登陆的时候把输入的密码再算一遍进行比对,musl的crypt有一个特殊的行为:密码超过256字节时不报错、不返回空指针,而是返回正好一个字符的字符串*。2012年的设计——所以程序不检查crypt返回值是否为空指针,直接拿去比较会,musl改为返回一个“永远不可能任何真哈希”的字符串。问题是很多系统正好用单个*当账户密码字段(表示禁止密码登录)该代码主要用于验证musl:这是crypt在什么长度上正常哈希值改变错误的标记 cat > crypt_probe.c <<'EOF' #include #include #include #include int main(void) { static char pw[1024]; int 镜头[] = {8, 100, 128, 200, 230, 240, 250, 255, 256, 257, 260, 280, 300}; const char *salts[] = {"$6$saltsalt$", "$5$saltsalt$"}; for (int s = 0; s < 2; s++) { printf("== salt %.12s ==\n", salts[s]); for (无符号 i = 0; i < sizeof(lens) / sizeof(lens[0]); i++) { int len =lens[i]; memset(pw, 'A', len); pw[长度] = '\0'; char *r = crypt(pw, salts[s]); if (r == NULL) printf(" keylen=%3d -> NULL\n", len); else if (strcmp(r, "*") == 0) printf(" keylen=%3d -> \"*\" <-- 错误标记\n", len); else printf(" keylen=%3d -> %.20s... (正常哈希)\n", len, r);返回0; } EOF 构建脚本 cat > build_one.sh <<'EOF' #!/bin/sh # 用法: ./build_one.sh <容器名> <版本号,如 10.6p1> set -e NAME=$1; VER=$2 docker rm -f "$NAME" 2>/dev/null || true docker run -d --name "$NAME" \ -e http_proxy= -e https_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= \ -v "$(pwd):/lab:ro" alpine:latest sleep infinity docker exec "$NAME" apk add --no-cache build-base zlib-dev openssl-dev docker exec "$NAME" sh -c "tar xzf /lab/openssh-$VER.tar.gz -C /tmp" docker exec "$NAME" sh -c "cd /tmp/openssh-$VER && \ ./configure --prefix=/opt/ssh --without-pam --with-privsep-path=/var/empty \ >/tmp/configure.log 2>&1 && make -j\$(nproc) >/tmp/make.log 2>&1 && \ make install >/tmp/install.log 2>&1 && echo BUILD_OK || \ { tail -20 /tmp/configure.log /tmp/make.log; }" docker exec "$NAME" sh -c "mkdir -p /var/empty && chmod 711 /var/empty && \ { adduser -D -H -h /var/empty -s /sbin/nologin sshd 2>/dev/null || } && \ /opt/ssh/bin/ssh-keygen -A" docker exec "$NAME" sh
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱