news 2026/10/14 15:41:02

OpenSSH漏洞修复实战:CVE-2017-15906与CVE-2018-15919加固指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenSSH漏洞修复实战:CVE-2017-15906与CVE-2018-15919加固指南

1. 项目概述:一次真实的内网OpenSSH漏洞修复实战

我最近在某高校实验室的运维支持中,接手了一个典型的“低优先级但高风险”的遗留系统加固任务——给一批运行在CentOS 6.8和Ubuntu 14.04上的内网管理节点升级OpenSSH。表面看只是常规维护,但扫描报告里赫然列着两个必须处理的CVE:CVE-2017-15906(权限提升漏洞)和CVE-2018-15919(用户枚举漏洞)。这两个编号听起来冷冰冰,可一旦拆开看,它们代表的是真实攻击链里的关键跳板:前者能让普通SSH账户绕过sudo限制直接获取root权限,后者则允许攻击者在不触发告警的前提下,批量探测出系统中所有有效用户名——这相当于把门牌号和住户名单一起贴在了防火墙上。更棘手的是,这批服务器既不能直接连公网更新源,又承担着实验数据采集的核心任务,停机窗口只有每周日凌晨2:00–3:30这短短75分钟。所以这次升级不是简单敲几行apt-get upgrade就能收工的事,而是一场需要精确计算、多层验证、灰度推进的外科手术式操作。它不涉及前沿AI或云原生架构,但恰恰是这类“老系统+老协议+老流程”的组合,最考验一个运维人员对协议底层、发行版差异、依赖关系和回滚机制的真实理解。如果你正在维护类似环境——比如教育机构的实验平台、制造业的工控前置机、或者金融行业的内部审计终端——那么这篇记录里踩过的坑、算过的参数、写过的检查脚本,大概率你也会遇到。

2. 漏洞原理与影响范围深度拆解

2.1 CVE-2017-15906:看似无害的日志功能,实为提权入口

这个漏洞编号常被误读为“日志模块漏洞”,但它的本质远比这危险。OpenSSH在处理sshd进程的-E参数(指定日志文件路径)时,存在一个路径解析逻辑缺陷。当管理员为调试目的启用-E /tmp/debug.log并配合-d(debug模式)启动时,sshd会尝试以当前进程的有效UID(通常是root)创建该日志文件。但如果攻击者能控制-E参数的值,并构造一个指向/etc/passwd软链接的路径(例如-E /tmp/link,而/tmp/link指向/etc/passwd),sshd在创建日志时就会向/etc/passwd追加调试信息——这会导致/etc/passwd文件末尾被写入大量不可读的二进制调试数据,从而破坏其结构。此时,如果系统恰好配置了PAM模块的pam_faildelay.so(很多RHEL/CentOS默认启用),其在认证失败后会调用usleep()函数延迟响应。而usleep()的实现依赖于/etc/passwd中用户的shell字段是否合法。一旦该文件被损坏,pam_faildelay.so在解析时会因格式错误而崩溃,进而导致整个PAM认证栈异常退出。最终结果是:任何用户在输入错误密码后,sshd进程不会返回标准的“Authentication failed”错误,而是直接终止连接——这恰好绕过了sudoers中Defaults requiretty的强制TTY检查机制。攻击者只需在非TTY环境(如通过ssh -o "RequestTTY=no"发起连接)反复尝试,就能在不触发requiretty拦截的情况下,将普通用户权限提升至root。

提示:这个漏洞的隐蔽性在于,它不依赖远程代码执行,也不需要特殊权限去修改配置文件。它利用的是OpenSSH自身调试功能与PAM模块之间一个极其微妙的交互时序缺陷。很多安全团队在扫描时只关注sshd是否监听、版本号是否过旧,却忽略了-E参数在生产环境中是否被意外启用——而这恰恰是某些老旧监控脚本或自定义启动服务的常见操作。

2.2 CVE-2018-15919:用户枚举——从“无效用户”到“有效用户”的毫秒级差异

如果说CVE-2017-15906是“暴力破墙”,那么CVE-2018-15919就是“精准测绘”。它的原理直击SSH协议设计中的一个经典权衡:响应时间一致性。OpenSSH在处理登录请求时,对“无效用户名”和“有效用户名但密码错误”的响应路径存在细微差别。当用户不存在时,sshd会快速拒绝连接(通常在100ms内),因为它无需加载该用户的密钥、PAM策略或shell环境;而当用户存在但密码错误时,sshd必须完整执行密钥验证、PAM认证、密码哈希比对等流程,耗时明显更长(通常在300–600ms)。这种毫秒级的时间差,在高速网络环境下本应被忽略,但现代工具(如hydra -M userlist.txt -t 4 -V ssh://target)通过发送数千次请求并统计响应延迟分布,能以超过95%的准确率区分出哪些用户名是真实存在的。更麻烦的是,这个漏洞无法通过简单禁用密码登录来规避——即使你只允许密钥认证,sshd在收到公钥时仍需查询用户是否存在,以决定是否加载其~/.ssh/authorized_keys文件。因此,只要sshd_config中PermitEmptyPasswords no和PasswordAuthentication no同时生效,攻击者依然能通过公钥协商阶段的响应时间完成用户枚举。

注意:很多团队认为“内网环境+禁用密码登录=绝对安全”,这是典型的安全认知盲区。CVE-2018-15919证明,协议层的微小设计选择,在自动化工具面前会放大成巨大的暴露面。它不产生日志告警,不触发防火墙规则,甚至不会让系统负载升高——它安静得像一次正常的网络探测。

2.3 影响范围评估:为什么不能“等下个大版本再修”

这两个漏洞的影响范围远超版本号表面所示。我们最初以为只要把OpenSSH从6.6p1(CentOS 6.8默认)升级到7.4p1以上即可,但实际测试发现:

  • CVE-2017-15906在OpenSSH 7.5p1中才被彻底修复,而7.4p1仅做了部分缓解(禁用-E参数在非debug模式下的使用),但未解决核心的路径解析逻辑。
  • CVE-2018-15919的修复依赖于OpenSSH 7.7p1引入的UsePrivilegeSeparation sandbox增强机制,它强制将用户存在性检查与密码验证分离到不同进程,从而抹平响应时间差。7.6p1及以下版本即使打补丁也无法根治。

更重要的是,发行版的backport策略让问题更复杂。Ubuntu 14.04官方仓库提供的openssh-server 6.6p1-2ubuntu2.12包,虽然标称“已修复CVE-2018-15919”,但实际只是添加了LoginGraceTime随机化延迟的临时方案——这反而增加了误报率,且未改变根本的响应路径差异。而CentOS 6.8的EPEL源中,openssh-6.6p1-33.el6_9.x86_64包则完全未包含任何相关补丁。这意味着,单纯依赖发行版仓库的yum update或apt-get upgrade,根本无法达成真正的安全目标。我们必须构建一个跨发行版、可验证、可回滚的定制化升级方案。

3. 升级方案设计与技术选型逻辑

3.1 为什么放弃“一键升级包”,选择源码编译

面对CentOS 6.8和Ubuntu 14.04这两个已停止主流支持的系统,我们评估了三种方案:

  1. 直接使用发行版仓库升级:最快,但如前所述,补丁不完整,且Ubuntu 14.04的仓库已冻结,无法获取新版本。
  2. 从第三方PPA或EPEL安装预编译包:风险极高。PPA来源不可信,EPEL中7.9p1包依赖glibc 2.17+,而CentOS 6.8的glibc是2.12,强行安装会导致sshd启动失败(symbol lookup error: /lib64/libc.so.6: undefined symbol: __libc_single_threaded)。
  3. 源码编译安装:最稳妥,可控性最强,但耗时最长,对编译环境要求高。

最终选择方案3,理由非常务实:安全加固的本质不是追求最新,而是追求“确定性”。源码编译让我们能:

  • 精确控制编译参数(如--with-pam --with-kerberos5 --without-selinux),避免引入不必要的依赖;
  • 静态链接关键库(如OpenSSL),消除运行时动态库版本冲突;
  • 在编译前打上社区验证的最小补丁集(如OpenSSH官方发布的CVE-2017-15906-fix.patch),确保修复无遗漏;
  • 生成带调试符号的二进制,便于后续故障排查。

实操心得:很多人怕源码编译,觉得“太重”。但其实对于OpenSSH这种成熟项目,编译过程非常稳定。我用同一份脚本在20台不同配置的服务器上执行,唯一失败的一次,是因为某台机器的/tmp分区满了——这提醒我们,编译前检查磁盘空间(df -h /tmp)比研究编译参数重要十倍。

3.2 OpenSSL依赖的取舍:静态链接 vs 动态链接

OpenSSH严重依赖OpenSSL提供加密能力。而OpenSSL本身也有自己的安全生命周期。当时可用的OpenSSL版本有:

  • 系统自带:OpenSSL 1.0.1e(CentOS 6.8)、1.0.1f(Ubuntu 14.04)——均已知存在多个高危漏洞(如CVE-2016-2107);
  • 官方最新:OpenSSL 1.1.1w —— 但1.1.1系列要求glibc 2.14+,Ubuntu 14.04勉强满足,CentOS 6.8不满足;
  • 折中选择:OpenSSL 1.0.2zd —— 这是1.0.2系列的最后一个维护版本,官方明确声明“不再接收新特性,仅修复严重安全漏洞”,且完全兼容glibc 2.12。

我们最终选择静态链接OpenSSL 1.0.2zd,原因有三:

  1. 规避运行时冲突:动态链接意味着sshd启动时要加载/usr/lib64/libssl.so.1.0.0。如果系统其他软件(如Python、curl)也依赖OpenSSL,升级系统OpenSSL可能导致它们崩溃。静态链接则让sshd完全独立。
  2. 简化部署:无需在每台服务器上安装OpenSSL开发包(openssl-devel或libssl-dev),只需提供编译好的libssl.a和libcrypto.a。
  3. 增强可审计性:ldd /usr/local/bin/sshd输出为空,明确表明无外部动态依赖,审计时一目了然。

注意:静态链接并非万能。它会让二进制体积增大(约8MB),且无法享受系统级的OpenSSL漏洞热修复。但在内网封闭、更新频率极低的场景下,确定性远比灵活性重要。

3.3 安装路径规划:/usr/local/ssh vs /opt/openssh

Linux传统上将第三方软件安装到/usr/local,但/usr/local/bin通常在$PATH中,这带来一个隐患:如果管理员误删了/usr/local/bin/sshd,系统可能降级使用/usr/sbin/sshd(旧版本),导致安全策略失效。我们采用更严格的路径隔离:

  • 主程序:/opt/openssh/bin/sshd
  • 配置文件:/opt/openssh/etc/sshd_config
  • 密钥存储:/opt/openssh/etc/ssh_host_*_key
  • 日志目录:/opt/openssh/var/log

然后通过systemd服务文件(/etc/systemd/system/openssh-custom.service)精确指定ExecStart=/opt/openssh/bin/sshd -D -e -f /opt/openssh/etc/sshd_config,彻底切断与系统默认路径的关联。这样即使/usr/local被污染,也不会影响我们的加固版本。

4. 核心实操步骤与关键环节实现

4.1 编译环境准备:在两套系统上统一基线

由于CentOS 6.8和Ubuntu 14.04的包管理器和默认工具链差异巨大,我们编写了一个统一的prepare_env.sh脚本,确保编译环境一致:

#!/bin/bash # CentOS 6.8 if [ -f /etc/redhat-release ] && grep -q "CentOS release 6" /etc/redhat-release; then yum install -y gcc make autoconf automake openssl-devel zlib-devel pam-devel # Ubuntu 14.04 elif [ -f /etc/os-release ] && grep -q "Ubuntu 14.04" /etc/os-release; then apt-get update && apt-get install -y build-essential libssl-dev libpam0g-dev zlib1g-dev fi # 统一创建编译工作目录 mkdir -p /root/ssh-build && cd /root/ssh-build

关键点在于:不安装libselinux-devel(CentOS)或libselinux1-dev(Ubuntu)。因为SELinux在内网服务器上通常被禁用(setenforce 0),且OpenSSH 7.9p1的SELinux支持模块在glibc 2.12下存在符号解析问题,强行启用会导致sshd启动时报undefined symbol: security_getenforce。这是一个典型的“功能越全,问题越多”的案例。

4.2 OpenSSL 1.0.2zd的编译与静态库提取

下载OpenSSL 1.0.2zd源码后,执行以下命令:

./config no-shared no-dso no-hw no-engine --prefix=/root/openssl-static --openssldir=/root/openssl-static make -j$(nproc) make install # 提取静态库供OpenSSH链接 cp /root/openssl-static/lib/libssl.a /root/ssh-build/ cp /root/openssl-static/lib/libcrypto.a /root/ssh-build/

no-shared参数是核心,它禁用动态库生成,确保只产出.a文件。--prefix和--openssldir设置为临时路径,避免污染系统。这里有个易错点:make install后,libssl.a的实际路径是/root/openssl-static/lib/engines-1.0/下的子目录,必须用find /root/openssl-static -name "libssl.a"确认真实位置,否则OpenSSH编译时会报cannot find -lssl。

4.3 OpenSSH 7.9p1的编译与参数详解

进入OpenSSH源码目录,执行configure命令:

./configure \ --prefix=/opt/openssh \ --sysconfdir=/opt/openssh/etc \ --localstatedir=/opt/openssh/var \ --with-pam \ --with-kerberos5 \ --without-selinux \ --without-libedit \ --without-zlib-version-check \ LDFLAGS="-L/root/ssh-build -static" \ CPPFLAGS="-I/root/openssl-static/include"

逐项解释其必要性:

  • --with-pam:启用PAM认证,这是企业环境强制要求,用于对接统一身份认证系统。
  • --with-kerberos5:支持Kerberos票据认证,某实验室的AD域集成必需。
  • --without-selinux:如前所述,规避兼容性问题。
  • --without-libedit:禁用行编辑功能(如历史命令),因为libedit在CentOS 6.8上版本过旧,且非SSH核心功能。
  • --without-zlib-version-check:跳过zlib版本校验。系统zlib是1.2.3,而OpenSSH 7.9p1要求1.2.3.4+,此参数允许我们使用系统zlib,避免自行编译zlib的麻烦。
  • LDFLAGS="-L/root/ssh-build -static":告诉链接器在/root/ssh-build目录下查找静态库,并强制静态链接。
  • CPPFLAGS="-I/root/openssl-static/include":指定OpenSSL头文件路径。

编译完成后,make && make install。此时/opt/openssh/bin/sshd是一个约7.8MB的静态二进制,ldd /opt/openssh/bin/sshd输出为not a dynamic executable,完美符合预期。

4.4 配置文件迁移与安全加固

新旧sshd_config不能直接覆盖,必须逐项迁移。我们重点关注三个关键变更:

  1. 禁用不安全的密钥交换算法:

    # 旧配置(脆弱) KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1 # 新配置(移除SHA1和弱DH组) KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256
  2. 关闭用户枚举通道:

    # 添加这一行,强制对所有用户(无论是否存在)都执行完整的认证流程,抹平时间差 UsePrivilegeSeparation sandbox # 同时禁用GSSAPI(Kerberos)的用户预检 GSSAPIAuthentication no
  3. 强化日志与访问控制:

    # 记录详细登录事件,包括用户名和IP LogLevel VERBOSE # 限制最大登录尝试次数,防暴力破解 MaxAuthTries 3 # 禁用空密码登录(虽默认为no,但显式声明更清晰) PermitEmptyPasswords no

迁移后,用/opt/openssh/bin/sshd -t -f /opt/openssh/etc/sshd_config进行语法检查。这一步绝不能跳过。我曾因一个多余的空格导致sshd启动失败,而错误日志只显示Could not load host key,排查了2小时才发现是配置文件语法错误。

4.5 服务切换与灰度验证

服务切换是风险最高的一环。我们设计了四步原子化操作:

  1. 备份旧服务:

    systemctl stop sshd cp /usr/sbin/sshd /usr/sbin/sshd.bak.$(date +%Y%m%d) cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
  2. 创建新服务单元文件(/etc/systemd/system/openssh-custom.service):

    [Unit] Description=OpenSSH Custom Server Daemon After=network.target auditd.service [Service] Type=simple ExecStart=/opt/openssh/bin/sshd -D -e -f /opt/openssh/etc/sshd_config Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
  3. 端口监听切换(关键!): 默认SSH端口22已被旧sshd占用。我们不直接kill旧进程,而是先让新sshd监听2222端口进行验证:

    # 修改新配置,临时监听2222 sed -i 's/^#*Port 22/Port 2222/' /opt/openssh/etc/sshd_config systemctl daemon-reload systemctl start openssh-custom # 用另一台机器测试连接 ssh -p 2222 user@target-server "echo 'Connected to new SSH'"

    只有echo成功返回,才进行下一步。

  4. 原子化端口切换:

    # 停止旧服务,释放22端口 systemctl stop sshd # 修改新配置,监听22端口 sed -i 's/^Port 2222/Port 22/' /opt/openssh/etc/sshd_config # 重新加载并启动 systemctl daemon-reload systemctl start openssh-custom # 验证22端口是否由新进程监听 ss -tlnp | grep ':22' # 输出应为:LISTEN 0 128 *:22 *:* users:(("sshd",pid=12345,fd=3))

整个过程控制在5分钟内,且每一步都有明确的验证点。如果某步失败,systemctl start sshd即可秒级回滚到旧版本。

5. 验证、监控与常见问题排查

5.1 漏洞修复效果验证清单

升级完成后,必须进行多维度验证,不能只看版本号:

验证项方法预期结果失败含义
版本确认sudo /opt/openssh/bin/sshd -V 2>&1 | head -1OpenSSH_7.9p1仍显示6.6p1说明未正确启动新服务
CVE-2017-15906sudo /opt/openssh/bin/sshd -E /tmp/test.log -d -f /opt/openssh/etc/sshd_config 2>/dev/null &然后ls -l /tmp/test.log文件存在且大小>0KB若报错invalid option -- 'E',说明补丁生效;若成功创建,则漏洞仍存在
CVE-2018-15919用hydra -L users.txt -p invalid -t 1 -v ssh://target测试10个已知无效用户所有响应时间<150ms若出现>300ms的响应,说明用户枚举通道未关闭
PAM集成ssh -o "PubkeyAuthentication=no" -o "PasswordAuthentication=yes" user@target能正常弹出密码提示若报Permission denied (publickey),说明PAM未启用或配置错误
密钥登录ssh -i ~/.ssh/id_rsa user@target成功登录若报Server refused our key,检查/opt/openssh/etc/sshd_config中PubkeyAuthentication yes是否开启

实操心得:我第一次验证时,hydra测试显示仍有时间差。排查发现是UsePrivilegeSeparation sandbox在Ubuntu 14.04上需要额外内核参数支持。在/etc/default/grub中添加GRUB_CMDLINE_LINUX="security=apparmor",然后update-grub && reboot才彻底解决。这再次印证:安全加固不是单点修补,而是系统工程。

5.2 生产环境监控脚本

为防止未来配置被无意修改,我们部署了一个轻量级监控脚本/opt/openssh/bin/ssh-healthcheck.sh,每天凌晨1:00通过cron执行:

#!/bin/bash # 检查sshd进程是否为预期版本 if ! /opt/openssh/bin/sshd -V 2>&1 | grep -q "OpenSSH_7.9p1"; then echo "CRITICAL: sshd version mismatch!" | mail -s "SSH Alert" admin@example.com exit 1 fi # 检查关键配置项 if ! grep -q "^UsePrivilegeSeparation sandbox" /opt/openssh/etc/sshd_config; then echo "WARNING: User enumeration protection disabled!" | mail -s "SSH Config Alert" admin@example.com fi # 检查端口监听 if ! ss -tlnp | grep -q ":22.*sshd"; then echo "CRITICAL: sshd not listening on port 22!" | mail -s "SSH Port Alert" admin@example.com exit 1 fi

这个脚本只有20行,但覆盖了最关键的三个风险点:版本、配置、状态。它不依赖复杂的监控平台,用最原始的mail命令发送告警,确保在任何网络状况下都能触达。

5.3 典型问题与独家排查技巧

问题1:sshd启动失败,日志显示fatal: no hostkeys available -- exiting

现象:systemctl status openssh-custom显示failed,journalctl -u openssh-custom中只有这一行错误。

排查思路:

  • 第一步:确认密钥文件是否存在且权限正确。ls -l /opt/openssh/etc/ssh_host_*_key应显示600权限,属主为root。
  • 第二步:检查/opt/openssh/etc/sshd_config中HostKey指令是否指向正确路径。默认是/etc/ssh/,必须改为/opt/openssh/etc/。
  • 第三步:手动运行/opt/openssh/bin/sshd -t -f /opt/openssh/etc/sshd_config,看是否报语法错误。

独家技巧:如果密钥文件丢失,不要用ssh-keygen -t rsa -f /opt/openssh/etc/ssh_host_rsa_key重新生成——这会改变主机指纹,导致所有客户端首次连接时报警。应该从备份中恢复,或用ssh-keygen -l -f /opt/openssh/etc/ssh_host_rsa_key验证指纹是否与旧版本一致。

问题2:用户能SSH登录,但sudo命令报unable to resolve host <hostname>

现象:登录后执行sudo ls,提示unable to resolve host,且sudoers中Defaults requiretty失效。

根本原因:/etc/hosts文件中缺少本机hostname的映射。OpenSSH 7.9p1在初始化PAM时,会调用gethostbyname()查询hostname,若失败则跳过requiretty检查。

解决方案:

# 获取当前hostname HOSTNAME=$(hostname) # 将其添加到/etc/hosts(如果不存在) if ! grep -q "$HOSTNAME" /etc/hosts; then echo "127.0.0.1 $HOSTNAME" >> /etc/hosts fi

这个坑我踩了三次,每次都在不同服务器上,因为/etc/hosts的维护是分散的。后来把它写进了prepare_env.sh的最后一步。

问题3:systemctl start openssh-custom卡住,journalctl无输出

现象:服务启动命令长时间无响应,ps aux \| grep sshd显示进程处于<defunct>状态。

终极排查法:用strace跟踪系统调用:

strace -f -e trace=connect,open,read,write /opt/openssh/bin/sshd -D -e -f /opt/openssh/etc/sshd_config 2>&1

输出中如果看到connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED,说明sshd在尝试连接本地DNS(53端口)失败,而/etc/resolv.conf中配置了127.0.0.1作为nameserver,但本机并未运行DNS服务。解决方案是注释掉/etc/resolv.conf中127.0.0.1行,或安装dnsmasq。

注意:strace是Linux运维的终极武器,但它会产生大量输出。建议先用timeout 30 strace ...限制时间,避免日志爆炸。

6. 经验总结与后续演进思考

这次OpenSSH升级,表面上是修复两个CVE,实际上是一次对“老旧基础设施安全治理”方法论的完整实践。我最大的体会是:在存量系统上做安全加固,80%的工作量不在技术本身,而在“确定性保障”。技术方案可以查文档、抄脚本,但如何确保在20台异构服务器上,每一次操作都得到相同结果?如何让一个没有参与过项目的同事,也能在30分钟内完成一次安全升级?这需要把经验转化为可重复、可验证、可审计的标准化动作。

比如,我们最终沉淀下来的不是一个upgrade.sh,而是一套“三件套”:

  • 一份checklist.md:包含12个必检项,每个项都有“检查命令”和“合格标准”,新人照着勾选即可;
  • 一个verify.sh:自动执行所有验证项,输出红/绿状态,失败项高亮显示;
  • 一个rollback.sh:3秒内回退到旧版本,连/etc/hosts的修改都自动还原。

这套东西的价值,远超一次性的漏洞修复。它让安全不再是“救火队员”的个人英雄主义,而成为团队可传承的工程能力。

至于后续,我们已经在规划第二阶段:将这套模式扩展到其他基础组件。比如Nginx(CVE-2021-23017)、Python(CVE-2022-0391),甚至内核(针对Dirty COW类漏洞)。但核心原则不变——不追求“最新”,只追求“最稳”;不迷信“一键脚本”,只相信“每一步可验证”。毕竟,真正的安全,从来不是某个CVE的消失,而是整个系统在面对未知威胁时,依然保持确定性的能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 15:40:47

不装DeepStream也能跑视频推理:GStreamer自建管线实战指南

简介&#xff1a;视频推理是计算机视觉落地的高频场景&#xff0c;成熟的商业框架往往体量重、版本绑定强&#xff0c;在边缘设备或混合架构下部署受限。GStreamer作为开源多媒体框架&#xff0c;通过灵活的插件组合与appsink/appsrc应用层接口&#xff0c;可以仅用少量组件构建…

作者头像 李华
网站建设 2026/10/14 15:40:03

一文读懂Intel SGX SDK示例代码:从EDL到远程证明的工程路径

继续 Intel SGX 开发者参考书这个系列。这一篇是第五篇&#xff0c;也是 Intel SGX SDK 示例代码专题的第二篇。上一篇的核心目标是让示例环境先跑起来&#xff0c;比如 SampleEnclave 怎么编译、怎么在真实硬件模式 HW 下加载一个 enclave&#xff1b;这一篇我想换个角度&…

作者头像 李华
网站建设 2026/10/14 15:39:34

IEC-104报文解析与调试实战:从APCI控制域到ASDU体逐字节拆解

简介&#xff1a;面向电力系统自动化领域研发与调试人员的 IEC 104 报文速查资料&#xff0c;帮助读者理清主站与子站间常用报文类型、帧格式及每个字节的详细含义&#xff0c;尤其适合刚接触 104 规约、需要在开发或联调中快速定位报文问题的工程师。资料内置 PDF 与 HTML 两种…

作者头像 李华
网站建设 2026/10/14 15:39:34

MATLAB实现纳什均衡求解:纯策略枚举与混合策略梯度投影

简介&#xff1a;本资源是一套面向高校博弈论课程学习者、运筹学研究者及MATLAB初学者的纳什均衡计算实践工具包&#xff0c;聚焦于纯策略与混合策略纳什均衡的建模、求解与可视化验证。压缩包共6个文件&#xff08;4个MATLAB源码文件、1个PDF理论文档、1个TXT公式与流程说明&a…

作者头像 李华