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. 总结
核心要点
- CVE-2026-35385:scp 下载文件保留 setuid 权限,可导致权限提升
- CVE-2026-35414:authorized_keys principals 绕过,可绕过认证限制
- CVE-2026-3497:未初始化变量,可导致信息泄露和 DoS
- 修复方案:升级到各发行版修复版本
- 临时缓解:使用 sftp 替代 scp、审计 principals 配置、限制连接速率
修复优先级
markdown
P0(24小时内):
- 公网暴露的 SSH 服务器
- 使用 scp 下载外部文件的系统
P1(72小时内):
- 使用 SSH 证书认证的环境
- 内网 SSH 服务器
P2(1周内):
- 所有服务器统一升级
- 建立 SSH 安全监控体系
- 审计所有 authorized_keys 配置