【身份认证】CVE-2026-3497/35385/35414: OpenSSH 多个漏洞修复指南——文件权限提升 + 信息泄露 + 认证绕过

2026 年 6 月 11 日,OpenSSH 官方发布安全更新,修复了三个安全漏洞。其中 CVE-2026-35385(CVSS 8.1)的 scp 命令在下载文件时未正确设置 setuid/setgid 权限位,可导致权限提升;CVE-2026-35414(CVSS 8.1)的 authorized_keys principals 选项处理错误可导致认证绕过;CVE-2026-3497(CVSS 7.5)的未初始化变量可导致信息泄露和 DoS。本文深入分析三个漏洞的根因、攻击场景,并提供从检测到修复的完整指南。

1. 漏洞全景概览

1.1 三个漏洞速览

CVE ID CVSS 评分 等级 漏洞类型 触发条件 影响范围
CVE-2026-35385 8.1 HIGH scp 文件权限提升 使用 scp 下载含 setuid/setgid 的文件 所有使用 scp 的系统
CVE-2026-35414 8.1 HIGH authorized_keys principals 绕过 使用 authorized_keys 的 principals 选项 使用 SSH 证书认证的系统
CVE-2026-3497 7.5 HIGH 未初始化变量 → 信息泄露/DoS 特定网络条件下连接 所有 OpenSSH 服务器

1.2 修复版本对照

发行版 受影响版本 修复版本 状态
OpenSSH 上游 < 10.0p1 10.0p1 已发布
Ubuntu 24.04 openssh-client 1:9.6p1-3ubuntu13 1:9.6p1-3ubuntu13.1 已发布
Ubuntu 22.04 openssh-client 1:8.9p1-3ubuntu0.x 1:8.9p1-3ubuntu0.10 已发布
RHEL 9 openssh-8.7p1-38.el9 openssh-8.7p1-40.el9 已发布
RHEL 8 openssh-8.0p1-19.el8 openssh-8.0p1-20.el8 已发布
Debian 12 openssh-client 1:9.2p1-2+deb12u2 1:9.2p1-2+deb12u3 已发布
SUSE openssh-9.3p1 SUSE-SU-2026:2375-1 已发布

1.3 三个漏洞的关联

#mermaid-svg-4CYydUcdvSw953HS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4CYydUcdvSw953HS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4CYydUcdvSw953HS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4CYydUcdvSw953HS .error-icon{fill:#552222;}#mermaid-svg-4CYydUcdvSw953HS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4CYydUcdvSw953HS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4CYydUcdvSw953HS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4CYydUcdvSw953HS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4CYydUcdvSw953HS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4CYydUcdvSw953HS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4CYydUcdvSw953HS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4CYydUcdvSw953HS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4CYydUcdvSw953HS .marker.cross{stroke:#333333;}#mermaid-svg-4CYydUcdvSw953HS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4CYydUcdvSw953HS p{margin:0;}#mermaid-svg-4CYydUcdvSw953HS .edge{stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .section--1 rect,#mermaid-svg-4CYydUcdvSw953HS .section--1 path,#mermaid-svg-4CYydUcdvSw953HS .section--1 circle,#mermaid-svg-4CYydUcdvSw953HS .section--1 polygon,#mermaid-svg-4CYydUcdvSw953HS .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section--1 text{fill:#ffffff;}#mermaid-svg-4CYydUcdvSw953HS .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-4CYydUcdvSw953HS .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth--1{stroke-width:17;}#mermaid-svg-4CYydUcdvSw953HS .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-0 rect,#mermaid-svg-4CYydUcdvSw953HS .section-0 path,#mermaid-svg-4CYydUcdvSw953HS .section-0 circle,#mermaid-svg-4CYydUcdvSw953HS .section-0 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-4CYydUcdvSw953HS .section-0 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-0{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-0{stroke-width:14;}#mermaid-svg-4CYydUcdvSw953HS .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-1 rect,#mermaid-svg-4CYydUcdvSw953HS .section-1 path,#mermaid-svg-4CYydUcdvSw953HS .section-1 circle,#mermaid-svg-4CYydUcdvSw953HS .section-1 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-1 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-1{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-1{stroke-width:11;}#mermaid-svg-4CYydUcdvSw953HS .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-2 rect,#mermaid-svg-4CYydUcdvSw953HS .section-2 path,#mermaid-svg-4CYydUcdvSw953HS .section-2 circle,#mermaid-svg-4CYydUcdvSw953HS .section-2 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-2 text{fill:#ffffff;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-2{stroke-width:8;}#mermaid-svg-4CYydUcdvSw953HS .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-3 rect,#mermaid-svg-4CYydUcdvSw953HS .section-3 path,#mermaid-svg-4CYydUcdvSw953HS .section-3 circle,#mermaid-svg-4CYydUcdvSw953HS .section-3 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-3 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-3{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-3{stroke-width:5;}#mermaid-svg-4CYydUcdvSw953HS .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-4 rect,#mermaid-svg-4CYydUcdvSw953HS .section-4 path,#mermaid-svg-4CYydUcdvSw953HS .section-4 circle,#mermaid-svg-4CYydUcdvSw953HS .section-4 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-4 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-4{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-4{stroke-width:2;}#mermaid-svg-4CYydUcdvSw953HS .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-5 rect,#mermaid-svg-4CYydUcdvSw953HS .section-5 path,#mermaid-svg-4CYydUcdvSw953HS .section-5 circle,#mermaid-svg-4CYydUcdvSw953HS .section-5 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-5 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-5{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-5{stroke-width:-1;}#mermaid-svg-4CYydUcdvSw953HS .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-6 rect,#mermaid-svg-4CYydUcdvSw953HS .section-6 path,#mermaid-svg-4CYydUcdvSw953HS .section-6 circle,#mermaid-svg-4CYydUcdvSw953HS .section-6 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-6 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-6{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-6{stroke-width:-4;}#mermaid-svg-4CYydUcdvSw953HS .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-7 rect,#mermaid-svg-4CYydUcdvSw953HS .section-7 path,#mermaid-svg-4CYydUcdvSw953HS .section-7 circle,#mermaid-svg-4CYydUcdvSw953HS .section-7 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-7 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-7{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-7{stroke-width:-7;}#mermaid-svg-4CYydUcdvSw953HS .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-8 rect,#mermaid-svg-4CYydUcdvSw953HS .section-8 path,#mermaid-svg-4CYydUcdvSw953HS .section-8 circle,#mermaid-svg-4CYydUcdvSw953HS .section-8 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-8 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-8{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-8{stroke-width:-10;}#mermaid-svg-4CYydUcdvSw953HS .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-9 rect,#mermaid-svg-4CYydUcdvSw953HS .section-9 path,#mermaid-svg-4CYydUcdvSw953HS .section-9 circle,#mermaid-svg-4CYydUcdvSw953HS .section-9 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-9 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-9{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-9{stroke-width:-13;}#mermaid-svg-4CYydUcdvSw953HS .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-10 rect,#mermaid-svg-4CYydUcdvSw953HS .section-10 path,#mermaid-svg-4CYydUcdvSw953HS .section-10 circle,#mermaid-svg-4CYydUcdvSw953HS .section-10 polygon,#mermaid-svg-4CYydUcdvSw953HS .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-10 text{fill:black;}#mermaid-svg-4CYydUcdvSw953HS .node-icon-10{font-size:40px;color:black;}#mermaid-svg-4CYydUcdvSw953HS .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .edge-depth-10{stroke-width:-16;}#mermaid-svg-4CYydUcdvSw953HS .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4CYydUcdvSw953HS .disabled,#mermaid-svg-4CYydUcdvSw953HS .disabled circle,#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:lightgray;}#mermaid-svg-4CYydUcdvSw953HS .disabled text{fill:#efefef;}#mermaid-svg-4CYydUcdvSw953HS .section-root rect,#mermaid-svg-4CYydUcdvSw953HS .section-root path,#mermaid-svg-4CYydUcdvSw953HS .section-root circle,#mermaid-svg-4CYydUcdvSw953HS .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-4CYydUcdvSw953HS .section-root text{fill:#ffffff;}#mermaid-svg-4CYydUcdvSw953HS .section-root span{color:#ffffff;}#mermaid-svg-4CYydUcdvSw953HS .section-2 span{color:#ffffff;}#mermaid-svg-4CYydUcdvSw953HS .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-4CYydUcdvSw953HS .edge{fill:none;}#mermaid-svg-4CYydUcdvSw953HS .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-4CYydUcdvSw953HS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} OpenSSH 2026.06 漏洞
CVE-2026-35385 scp权限提升
CVSS 8.1 HIGH
scp下载文件保留setuid
可导致本地权限提升
影响所有使用scp的系统
CVE-2026-35414 认证绕过
CVSS 8.1 HIGH
authorized_keys principals错误
可绕过SSH证书认证限制
影响证书认证环境
CVE-2026-3497 信息泄露
CVSS 7.5 HIGH
未初始化变量
可泄露内存数据
可导致DoS

2. CVE-2026-35385:scp 文件权限提升漏洞

2.1 漏洞根因分析

CVE-2026-35385 位于 OpenSSH 的 scp 命令实现中。当 scp 从远程服务器下载文件时,未正确处理 setuid/setgid 权限位,导致下载的文件在本地保留了 setuid/setgid 权限。

c 复制代码
// 漏洞版本简化示意(scp.c)
void receive_file(int fd, char *name, ...) {
    // 从远程获取文件属性
    struct stat st;
    get_remote_stat(&st);

    // 创建本地文件
    int local_fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0600);

    // 写入文件内容
    write_file_content(local_fd, fd);

    // 漏洞点:设置文件权限时未清除 setuid/setgid 位
    // 应该使用 st.st_mode & 0777 清除特殊权限位
    // 但实际使用了 st.st_mode & 07777 保留了 setuid/setgid
    fchmod(local_fd, st.st_mode & 07777);  // 漏洞!

    close(local_fd);
}

2.2 攻击场景

受害者 恶意SSH服务器 攻击者 受害者 恶意SSH服务器 攻击者 #mermaid-svg-tKxTclt2qqnvKObc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tKxTclt2qqnvKObc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tKxTclt2qqnvKObc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tKxTclt2qqnvKObc .error-icon{fill:#552222;}#mermaid-svg-tKxTclt2qqnvKObc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tKxTclt2qqnvKObc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tKxTclt2qqnvKObc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tKxTclt2qqnvKObc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tKxTclt2qqnvKObc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tKxTclt2qqnvKObc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tKxTclt2qqnvKObc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tKxTclt2qqnvKObc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tKxTclt2qqnvKObc .marker.cross{stroke:#333333;}#mermaid-svg-tKxTclt2qqnvKObc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tKxTclt2qqnvKObc p{margin:0;}#mermaid-svg-tKxTclt2qqnvKObc .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-tKxTclt2qqnvKObc text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-tKxTclt2qqnvKObc .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-tKxTclt2qqnvKObc .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-tKxTclt2qqnvKObc .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-tKxTclt2qqnvKObc .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-tKxTclt2qqnvKObc #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-tKxTclt2qqnvKObc .sequenceNumber{fill:white;}#mermaid-svg-tKxTclt2qqnvKObc #sequencenumber{fill:#333;}#mermaid-svg-tKxTclt2qqnvKObc #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-tKxTclt2qqnvKObc .messageText{fill:#333;stroke:none;}#mermaid-svg-tKxTclt2qqnvKObc .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-tKxTclt2qqnvKObc .labelText,#mermaid-svg-tKxTclt2qqnvKObc .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-tKxTclt2qqnvKObc .loopText,#mermaid-svg-tKxTclt2qqnvKObc .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-tKxTclt2qqnvKObc .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-tKxTclt2qqnvKObc .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-tKxTclt2qqnvKObc .noteText,#mermaid-svg-tKxTclt2qqnvKObc .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-tKxTclt2qqnvKObc .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-tKxTclt2qqnvKObc .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-tKxTclt2qqnvKObc .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-tKxTclt2qqnvKObc .actorPopupMenu{position:absolute;}#mermaid-svg-tKxTclt2qqnvKObc .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-tKxTclt2qqnvKObc .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-tKxTclt2qqnvKObc .actor-man circle,#mermaid-svg-tKxTclt2qqnvKObc line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-tKxTclt2qqnvKObc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 文件权限: 4755 (setuid root) scp 下载文件 漏洞:文件保留了 setuid 权限位 本地文件权限: 4755 (setuid) 文件以文件属主权限运行 如果属主是 root,则获得 root 权限 权限提升完成! 在服务器上放置含 setuid 的文件 scp user@server:/path/to/file ~/downloads/ 执行下载的文件

2.3 影响评估

影响维度 评估
完整性 高------可执行任意代码
可用性 中------可导致系统不稳定
机密性 高------可获得更高权限访问
攻击门槛 中------需要控制 SSH 服务器或中间人攻击

3. CVE-2026-35414:authorized_keys principals 绕过

3.1 漏洞根因分析

CVE-2026-35414 位于 OpenSSH 的 authorized_keys 文件解析逻辑中。当使用 SSH 证书认证且在 authorized_keys 中配置了 principals 选项时,解析逻辑存在缺陷。

c 复制代码
// 漏洞版本简化示意(auth2-pubkey.c)
int check_principals(char *file_principals, Key *cert) {
    char *principal;

    // 遍历证书中的 principals
    for (int i = 0; i < cert->nprincipals; i++) {
        principal = cert->principals[i];

        // 检查证书 principal 是否在 authorized_keys 的 principals 列表中
        // 漏洞点:当 principal 包含特殊字符时
        // 匹配逻辑存在缺陷
        if (match_principals(file_principals, principal)) {
            // 漏洞:某些特殊格式的 principal 可能错误匹配
            return 1;  // 认证通过
        }
    }

    return 0;  // 认证失败
}

3.2 攻击场景

bash 复制代码
# 场景:企业使用 SSH 证书认证,限制特定用户访问

# authorized_keys 中的 principals 限制
# 只允许 "admin" 用户访问
cert-authority,principals="admin" ssh-ed25519 AAAAC3Nz...

# 攻击者持有证书,但证书中的 principal 是 "user"
# 正常情况下应该被拒绝

# 漏洞:攻击者构造特殊格式的 principal
# 例如: "admin\nuser" 或 "admin\x00user"
# 可能绕过 principals 检查

3.3 影响评估

影响维度 评估
机密性 严重------可绕过认证访问系统
完整性 严重------可修改系统数据
攻击门槛 中------需要持有有效证书且了解 principals 配置

4. CVE-2026-3497:未初始化变量信息泄露

4.1 漏洞根因分析

CVE-2026-3497 位于 OpenSSH 的网络连接处理代码中。在特定网络条件下(如连接中断或异常重置),代码使用了未初始化的栈变量,可能导致内存数据泄露或服务崩溃。

c 复制代码
// 漏洞版本简化示意
void handle_connection(int sock) {
    struct sshbuf *buffer;  // 未初始化

    // 在特定错误路径中,buffer 未被赋值就被使用
    if (connection_error) {
        // 漏洞点:buffer 未初始化
        // 但错误处理代码尝试使用它
        sshbuf_free(buffer);  // UAF 或读取未初始化内存
    }

    // 正常路径
    buffer = sshbuf_new();
    // ...
}

4.2 影响评估

影响维度 评估
机密性 中------可能泄露栈上的内存数据
可用性 高------可导致 sshd 崩溃
攻击门槛 低------可通过网络触发

5. 修复方案

5.1 升级 OpenSSH

Why:这是最直接、最彻底的修复方式。各发行版已发布修复包。

bash 复制代码
# Ubuntu/Debian
sudo apt update
sudo apt install --only-upgrade openssh-server openssh-client

# 验证版本
ssh -V
# 预期输出: OpenSSH_9.6p1 Ubuntu-3ubuntu13.1, OpenSSL 3.0.13

# RHEL/CentOS
sudo dnf update openssh-server openssh-clients

# 验证版本
rpm -qa | grep openssh
# 预期输出: openssh-8.7p1-40.el9.x86_64

# SUSE/openSUSE
sudo zypper update openssh

# 从源码编译
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.0p1.tar.gz
tar xzf openssh-10.0p1.tar.gz
cd openssh-10.0p1
./configure --prefix=/usr --sysconfdir=/etc/ssh
make && sudo make install

重启 SSH 服务:

bash 复制代码
# 注意:不要直接重启 sshd,可能导致连接断开
# 使用 systemctl reload 重新加载配置
sudo systemctl reload sshd

# 或使用优雅重启
sudo kill -HUP $(pidof sshd)

5.2 临时缓解措施

CVE-2026-35385 缓解:使用 sftp 替代 scp
bash 复制代码
# 使用 sftp 替代 scp 下载文件
# sftp 不受此漏洞影响
sftp user@server:/path/to/file ~/downloads/

# 或使用 rsync 替代
rsync -avz user@server:/path/to/file ~/downloads/

# 如果必须使用 scp,下载后手动清除 setuid/setgid
scp user@server:/path/to/file ~/downloads/
chmod u-s,g-s ~/downloads/file  # 清除 setuid/setgid
CVE-2026-35414 缓解:审计 principals 配置
bash 复制代码
# 审计所有 authorized_keys 文件中的 principals 配置
sudo grep -r "principals=" /home/*/.ssh/authorized_keys /etc/ssh/

# 临时移除 principals 限制(降低安全性但避免绕过)
# 编辑 authorized_keys,移除 principals= 选项
# 改用其他认证限制方式
CVE-2026-3497 缓解:限制连接速率
bash 复制代码
# 在 sshd_config 中限制连接速率
# /etc/ssh/sshd_config
MaxStartups 10:30:60  # 限制并发未认证连接
LoginGraceTime 30     # 缩短认证超时

# 使用 fail2ban 防止暴力攻击
sudo apt install fail2ban
sudo systemctl enable fail2ban

5.3 容器环境修复

dockerfile 复制代码
# Dockerfile - 使用修复版本的 OpenSSH
FROM ubuntu:24.04

# 安装修复版本的 OpenSSH
RUN apt-get update && \
    apt-get install -y openssh-server=1:9.6p1-3ubuntu13.1 && \
    apt-get clean

# 配置 SSH
RUN mkdir /var/run/sshd
RUN echo 'root:strong_password' | chpasswd

# 安全配置
COPY sshd_config /etc/ssh/sshd_config

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

6. 深度加固方案

6.1 SSH 安全配置加固清单

markdown 复制代码
认证加固:
- [ ] 禁用密码认证,仅使用密钥认证
- [ ] 禁用 root 直接登录
- [ ] 使用 SSH 证书认证
- [ ] 配置双因素认证
- [ ] 限制允许登录的用户/组

网络加固:
- [ ] 修改默认端口(22 → 其他)
- [ ] 限制连接来源 IP
- [ ] 配置防火墙规则
- [ ] 使用 fail2ban 防暴力破解
- [ ] 限制并发连接数

权限加固:
- [ ] 审计 authorized_keys 文件
- [ ] 限制 sudo 权限
- [ ] 配置 chroot 环境
- [ ] 禁用不必要的功能(X11 转发等)

监控加固:
- [ ] 启用 SSH 日志记录
- [ ] 监控异常登录
- [ ] 配置登录告警
- [ ] 定期审计 SSH 配置

6.2 sshd_config 安全配置

bash 复制代码
# /etc/ssh/sshd_config 安全加固配置

# 基础安全
Port 2222                          # 修改默认端口
Protocol 2                         # 仅使用 SSH 协议 2
ListenAddress 10.0.0.1             # 绑定内网地址

# 认证安全
PermitRootLogin no                 # 禁止 root 直接登录
PasswordAuthentication no          # 禁用密码认证
PubkeyAuthentication yes           # 启用密钥认证
PermitEmptyPasswords no            # 禁止空密码
ChallengeResponseAuthentication no # 禁用挑战响应认证

# 授权安全
AllowUsers appuser deploy          # 仅允许特定用户
AllowGroups ssh-users              # 仅允许特定组
DenyUsers root nobody              # 禁止特定用户

# 连接限制
MaxAuthTries 3                     # 最大认证尝试次数
MaxStartups 10:30:60               # 并发未认证连接限制
LoginGraceTime 30                  # 认证超时时间
ClientAliveInterval 300            # 客户端存活检查间隔
ClientAliveCountMax 2              # 客户端存活检查次数

# 功能限制
X11Forwarding no                   # 禁用 X11 转发
AllowTcpForwarding no              # 禁用 TCP 转发
AllowAgentForwarding no            # 禁用 Agent 转发
PermitTunnel no                    # 禁用隧道
GatewayPorts no                   # 禁用网关端口

# 日志记录
LogLevel VERBOSE                   # 详细日志级别
SyslogFacility AUTHPRIV            # 日志设施

6.3 fail2ban 配置

ini 复制代码
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 300
bantime = 3600
banaction = iptables-multiport

# 针对 CVE-2026-3497 的规则
[sshd-ddos]
enabled = true
port = 2222
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 2
findtime = 60
bantime = 7200

6.4 监控告警

bash 复制代码
#!/bin/bash
# ssh_security_monitor.sh - SSH 安全监控脚本

# 监控异常登录
FAILED_LOGINS=$(grep "Failed password" /var/log/auth.log |
  grep "$(date +%b\ %d)" | wc -l)
if [ "$FAILED_LOGINS" -gt 10 ]; then
    echo "ALERT: 失败登录次数异常: $FAILED_LOGINS"
    # 可能正在遭受暴力破解
fi

# 监控异常连接
CONNECTIONS=$(ss -tn | grep :2222 | wc -l)
if [ "$CONNECTIONS" -gt 50 ]; then
    echo "ALERT: SSH 连接数异常: $CONNECTIONS"
    # 可能正在遭受 DoS 攻击
fi

# 监控成功登录
SUCCESS_LOGINS=$(grep "Accepted" /var/log/auth.log |
  grep "$(date +%b\ %d)" | wc -l)
if [ "$SUCCESS_LOGINS" -gt 20 ]; then
    echo "ALERT: 成功登录次数异常: $SUCCESS_LOGINS"
    # 可能存在认证绕过
fi

# 监控 setuid 文件
SUID_FILES=$(find /home -perm -4000 -type f 2>/dev/null | wc -l)
if [ "$SUID_FILES" -gt 0 ]; then
    echo "ALERT: 发现 setuid 文件: $SUID_FILES"
    # 可能是 CVE-2026-35385 被利用
fi

7. 验证修复效果

7.1 修复验证检查表

检查项 验证方法 预期结果
OpenSSH 版本 ssh -V >= 修复版本
scp 权限 scp 下载 setuid 文件 无 setuid 权限
principals 检查 测试证书认证 正确限制
连接稳定性 大量连接测试 无崩溃
密码认证 ssh -o PasswordAuthentication=yes Permission denied

7.2 自动化验证脚本

bash 复制代码
#!/bin/bash
# verify_ssh_fix.sh - 验证 OpenSSH 修复效果

echo "=== OpenSSH 安全修复验证 ==="

# 1. 验证版本
echo -n "1. OpenSSH 版本: "
ssh -V 2>&1

# 2. 验证 scp 权限修复
echo -n "2. scp 权限修复: "
# 创建测试文件并设置 setuid
touch /tmp/test_suid_file
chmod 4755 /tmp/test_suid_file
# 通过 scp 下载(本地测试)
scp localhost:/tmp/test_suid_file /tmp/downloaded_file 2>/dev/null
PERMS=$(stat -c "%a" /tmp/downloaded_file 2>/dev/null)
if [ "$PERMS" = "755" ]; then
    echo "PASS (setuid 已清除)"
else
    echo "FAIL (权限: $PERMS)"
fi
rm -f /tmp/test_suid_file /tmp/downloaded_file

# 3. 验证密码认证禁用
echo -n "3. 密码认证状态: "
RESULT=$(ssh -o PasswordAuthentication=yes -o BatchMode=yes localhost echo test 2>&1)
if echo "$RESULT" | grep -q "Permission denied"; then
    echo "PASS (密码认证已禁用)"
else
    echo "WARN - 需要手动验证"
fi

# 4. 验证 root 登录禁用
echo -n "4. Root 登录状态: "
RESULT=$(grep "^PermitRootLogin" /etc/ssh/sshd_config | awk '{print $2}')
if [ "$RESULT" = "no" ]; then
    echo "PASS (已禁用)"
else
    echo "FAIL (未禁用)"
fi

echo "=== 验证完成 ==="

8. 踩坑指南

坑1:升级 OpenSSH 后无法连接

现象:升级后 SSH 连接被拒绝。

根因:新版本 OpenSSH 默认禁用了不安全的算法。

解决:在客户端配置中启用兼容算法:

bash 复制代码
# ~/.ssh/config
Host old-server
    KexAlgorithms +diffie-hellman-group1-sha1
    HostKeyAlgorithms +ssh-rsa
    PubkeyAcceptedKeyTypes +ssh-rsa

坑2:重启 sshd 后连接断开

现象:重启 sshd 服务后,当前 SSH 连接断开。

根因 :直接使用 systemctl restart sshd 会终止所有连接。

解决:使用优雅重载:

bash 复制代码
# 优雅重载配置,不影响现有连接
sudo systemctl reload sshd

# 或使用 SIGHUP 信号
sudo kill -HUP $(pidof sshd)

坑3:禁用密码认证后用户无法登录

现象:禁用密码认证后,部分用户无法登录。

根因:用户未配置 SSH 密钥。

解决:在禁用密码认证前,确保所有用户已配置密钥:

bash 复制代码
# 批量为用户生成密钥
for user in user1 user2 user3; do
    sudo -u $user ssh-keygen -t ed25519 -f /home/$user/.ssh/id_ed25519 -N ""
    cat /home/$user/.ssh/id_ed25519.pub >> /home/$user/.ssh/authorized_keys
    sudo chown $user:$user /home/$user/.ssh/authorized_keys
    sudo chmod 600 /home/$user/.ssh/authorized_keys
done

9. 总结

核心要点

  1. CVE-2026-35385:scp 下载文件保留 setuid 权限,可导致权限提升
  2. CVE-2026-35414:authorized_keys principals 绕过,可绕过认证限制
  3. CVE-2026-3497:未初始化变量,可导致信息泄露和 DoS
  4. 修复方案:升级到各发行版修复版本
  5. 临时缓解:使用 sftp 替代 scp、审计 principals 配置、限制连接速率

修复优先级

markdown 复制代码
P0(24小时内):
- 公网暴露的 SSH 服务器
- 使用 scp 下载外部文件的系统

P1(72小时内):
- 使用 SSH 证书认证的环境
- 内网 SSH 服务器

P2(1周内):
- 所有服务器统一升级
- 建立 SSH 安全监控体系
- 审计所有 authorized_keys 配置

参考资源

相关推荐
三垣网安4 个月前
记一次补天公益SRC漏洞挖掘:弱口令+SQL注入+信息泄露
sql注入·信息泄露·弱口令
漠月瑾-西安5 个月前
软件忘了“擦黑板”:一次内核信息泄露事件(CVE-2024-49997)的深度剖析
网络安全·linux内核·内核安全·信息泄露·内存安全·cve漏洞分析
漏洞文库-Web安全10 个月前
CTFHub-Web-信息泄露
安全·web安全·网络安全·web·ctf·信息泄露·ctfhub
mooyuan天天1 年前
CTFHub 信息泄露通关笔记10:SVN泄露(2种方法)
web安全·信息泄露·ctfhub·svn泄露·源码泄露·dvcs ripper
mooyuan天天1 年前
CTFHub 信息泄露通关笔记8:Git泄露 Stash(两种方法渗透)
git stash·信息泄露·ctfhub·git泄露
mooyuan天天1 年前
CTFHub 信息泄露通关笔记2:PHPINFO泄露
信息泄露·ctfhub·phpinfo泄露·phpinfo
mooyuan天天1 年前
CTFHub 信息泄露通关笔记5:备份文件下载 vim文件
信息泄露·ctfhub·vim信息泄露·swp信息泄露
mooyuan天天1 年前
CTFHub 信息泄露通关笔记9:Git泄露 Index
信息泄露·ctfhub·git泄露·githack
H轨迹H2 年前
Jsmoke-一款强大的js检测工具,浏览器部署即用,使用方便且高效
网络安全·渗透测试·ctf·工具·web漏洞·信息泄露