NGINX 曝 9.2 分高危漏洞:潜伏 18 年,威胁全球约 1/3 服务器

IT之家 5 月 14 日消息,科技媒体 cyberkendra 昨日(5 月 13 日)发布博文,报道称 NGINX 被曝一组高危漏洞,已潜伏约 18 年,威胁全球约三分之一的网络服务器。

本次曝光的漏洞:

  • CVE-2026-42945 — 9.2 Critical
  • CVE-2026-42946 — 8.3 High
  • CVE-2026-40701 — 6.3 Medium
  • CVE-2026-42934 — 6.3 Medium

核心风险: 攻击者无需登录认证,只需发送一条特制 HTTP 请求,就能让 NGINX 工作进程崩溃;在合适条件下,还可能拿到服务器远程代码执行权限(RCE)。

漏洞原理: 最严重的 CVE-2026-42945 可追溯到 2008 年,长期存在于几乎所有标准 NGINX 构建版本中。问题出在 ngx_http_rewrite_module 的处理逻辑——某个内部标志位被设为参数转义状态后没有清掉,后续长度计算按原始字节数估算,但真正写入时却再次转义。攻击者 URI 中的 +%& 等字符会从 1 字节膨胀到 3 字节,导致缓冲区溢出。

depthfirst 已做出概念验证,显示在关闭 ASLR 的条件下可实现未认证 RCE。报告还提到理论方法称攻击者可通过重复请求逐步覆盖指针字节,绕过 ASLR。更麻烦的是 NGINX 的多进程架构反而给了攻击者反复试错机会:某工作进程崩溃后主进程会拉起新进程,且堆布局可能保持一致。

修复建议:

  • NGINX Open Source:升级到 1.31.0 或 1.30.1
  • NGINX Plus:升级到 R36 P4 或 R32 P6
  • 重启服务加载修复后的二进制文件
  • 临时缓解:将受影响 rewrite 规则中的未命名正则捕获改成命名捕获(不会走到有问题的转义路径)

这个漏洞影响面很大——NGINX 承载全球约 1/3 的网站,而且已存在 18 年之久。建议如果服务器有使用 NGINX rewrite 规则的尽快升级版本或采用临时缓解措施。

source/sh/bash

假设 14env.sh 脚本内容只有一行:export MY_VAR=”HelloWorld”

执行 source 14env.sh 后,在终端里直接输入 echo $MY_VAR,会输出 HelloWorld。这个变量会一直存在直到你关闭终端。
执行 sh 14env.sh 或 bash 14env.sh 后,再输入 echo $MY_VAR,会输出空行。因为变量在子进程中被设置,子进程结束变量就消失了。

运维实践建议:

当你需要配置当前工作环境(例如设置 JAVA_HOME, PATH 等)时,使用 source。
当你只是要运行一个完成某项任务的脚本时,使用 bash 或 sh。

centos紧急修复内核依赖库文件libselinux.so.1

[root@k8s-node02 ~]# ls -l /lib64/libselinux.so.1 
-rwxr-xr-x. 1 root root 155744 Apr  1  2020 /lib64/libselinux.so.1
[root@k8s-node02 ~]# rm -fr /lib64/libselinux.so.1
[root@k8s-node02 ~]# init 6
init: error while loading shared libraries: libselinux.so.1: cannot open shared object file: No such file or directory

问题一:xshell窗口无法重启;

问题二:xshell退出激活窗口后,无法通过ssh登录主机;

问题三:控制台登录主机,始终处于login状态,无法跳转至密码对话框;

问题四:重启服务器,无法正常进入页面

恢复误删除的内核文件操作步骤

  1. 光盘引导centttos系统镜像ISO
  2. 进入Troubleshooting->Rescue a CentOS system
  3. 选择1) Continue
  4. cp /lib64/libselinux.so.1 /mnt/sysimage/lib64/
  5. exit

tips
/mnt/sysimage 就是救援环境中挂载的“被救援系统”的根目录,对它的修改就是对原系统的修改;若需要在原系统环境中执行命令,建议 chroot 到 /mnt/sysimage 再进行操作。
​/mnt/sysimage​ 是被抢救系统根文件系统的目录。
chroot /mnt/sysimage​ 是对原系统的修复、检查或配置修改。

硬盘性能测试

mkdir test-data
fio –rw=write –ioengine=sync –fdatasync=1 –directory=test-data –size=2200m –bs=2300 –name=mytest

命令分解

mkdir test-data  # 创建测试目录
fio \
  --rw=write      # 测试模式:纯写入
  --ioengine=sync # I/O引擎:同步阻塞写入(模拟最严苛的持久化场景)
  --fdatasync=1   # 每次写入后调用fdatasync(),确保数据刷到磁盘(类似数据库安全写入)
  --directory=test-data  # 测试目录
  --size=2200m    # 每个线程写入总量:2200MB
  --bs=2300       # 块大小:2300字节(模拟非常规小块写入)
  --name=mytest   # 任务名称

关键参数作用

参数意义
--rw=write测试写入性能(非随机写入)。
--ioengine=sync使用同步I/O,每次写操作必须等待磁盘确认完成(性能低但数据安全)。
--fdatasync=1每次写操作后调用 fdatasync(),强制刷新内核缓冲区到磁盘(类似 fsync 但略轻量)。
--bs=2300

–size=2200m
设置非常规块大小(通常用4K/8K),可能是为了模拟特定业务场景的小数据块写入。
总写入量足够大,避免缓存影响测试结果。

典型应用场景

  1. 数据库持久化测试
  • 模拟事务日志(如WAL)的写入性能,因为 sync+fdatasync 是数据库保证ACID的常用配置。
  1. 磁盘可靠性验证
  • 测试磁盘在强制刷盘模式下的实际吞吐和延迟。
  1. 性能调优基准
  • 对比不同文件系统/磁盘设备在小块同步写入时的表现。

输出结果关注点

运行后会显示以下关键指标:

  • IOPS:每秒写入次数(2300字节/次)。
  • 带宽(BW):实际写入吞吐(如 MB/s)。
  • 延迟(lat):每次写入的平均耗时(尤其关注 syncfdatasync 的开销)。
    示例输出片段:
write: IOPS=500, BW=1.12MiB/s (1.17MB/s)
  sync (usec): min=100, max=10000, avg=2000
  fdatasync: 1 calls, total=10ms

注意事项

  1. 磁盘压力:此命令会高负载写入,避免在生产环境直接运行。
  2. 块大小优化bs=2300 可能导致未对齐写入,正常测试建议用 4K 的整数倍。
  3. 对比测试:移除 --fdatasync=1--ioengine=sync 可测试缓存写入性能(速度会快很多)。

su 与 su – 切换root变量

[ceshizhangzhao@ceshizhangzhao1 ~]$ whoami #确认当前用户为ceshizhangzhao   root
ceshizhangzhao
[ceshizhangzhao@ceshizhangzhao1 ~]$ su #不加用户就表示切换到root,当然也可以su root root
Password:
[root@ceshizhangzhao1 ceshizhangzhao]# env
HOSTNAME=ceshizhangzhao1
SHELL=/bin/bash
HISTSIZE=500
USER=ceshizhangzhao <--
MAIL=/var/spool/mail/ceshizhangzhao
PWD=/home/ceshizhangzhao <--
HOME=/root
LOGNAME=ceshizhangzhao
以下省略无关内容…
提示:使用su而不加上“-”这个参数,切换前的用户的相关信息还会存在。切换用户时,“su - 用户名”。
[root@ceshizhangzhao1 ceshizhangzhao]# exit #退出当前用户,这个命令也可以用ctrl+d
[ceshizhangzhao@ceshizhangzhao1 ~]$ su - root
Password:
[root@ceshizhangzhao1 ~]# env | egrep "USER|MALL|PWD|LOGNAME"
USER=root <--
PWD=/root <--
LOGNAME=root

总结:请su –

定期清理日志

!/bin/bash
设置变量
LOG_DIR="/a/b/c" # 替换为实际的日志目录
ARCHIVE_DIR="/a/b/c/history_archive" # 替换为存储归档的目录
DAYS_TO_KEEP=30 # 保留日志的天数
LOG_FILE="/a/b/c/history_archive/op_record.log" # 替换为实际的日志文件路径
创建归档目录(如果不存在)
mkdir -p "$ARCHIVE_DIR"
获取当前日期
CURRENT_DATE=$(date +%Y-%m-%d)
记录开始时间
echo "[$CURRENT_DATE] 开始压缩和归档日志…" >> "$LOG_FILE"
压缩并归档日志
for dir in "$LOG_DIR"/20*; do
if [ -d "$dir" ]; then
# 获取目录名
dir_name=$(basename "$dir")
# 压缩目录 tar -zcf "$ARCHIVE_DIR/${dir_name}.tar.gz" -C "$LOG_DIR" "$dir_name" # 检查压缩是否成功 if [ $? -eq 0 ]; then echo "[$CURRENT_DATE] 已压缩并归档: $dir_name" >> "$LOG_FILE" # 删除原始日志目录 rm -rf "$dir" echo "[$CURRENT_DATE] 已删除原始日志目录: $dir_name" >> "$LOG_FILE" else echo "[$CURRENT_DATE] 压缩失败: $dir_name" >> "$LOG_FILE" fi fi
done
清理超过指定天数的归档文件
find "$ARCHIVE_DIR" -type f -name "*.tar.gz" -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
echo "[$CURRENT_DATE] 已删除超过 $DAYS_TO_KEEP 天的归档文件" >> "$LOG_FILE"
记录结束时间
echo "[$CURRENT_DATE] 完成压缩和归档日志." >> "$LOG_FILE"

模糊的命令

1、命令$(basename $n)

n="/data/path-a/path-b/2024-log-dir"
COMPRESS_DIR=$(basename "$n")
echo $COMPRESS_DIR
2024-log-dir

2、tar -C目录路径

/data/abcp/access-mo-dispatch/2025-01-01
LOG_DIR="/data/abcp/access-mo-dispatch"
COMPRESS_DIR="2025-01-01"
tar -zcf "/data/abcp/access-mo-dispatch/2025_history_archive/2024-03-14_2024-log-dir.tar.gz" -C "/data/abcp/access-mo-dispatch" "2025-01-01"
归档压缩的结果
[root@k8s-node02 access-mo-dispatch]# tree
.
├── 2025-01-01
├── 2025-01-02
├── 2025-01-03
└── 2025_history_archive
└── 2024-03-14_2024-log-dir.tar.gz
4 directories, 1 file

SecureCRT改过期Linux密码

$language = "VBScript"
$interface = "1.0"
crt.Screen.Synchronous = True
Sub Main
Dim ipAddresses
ipAddresses = Array( _
"192.168.1.54", _
"192.168.1.52", _
"192.168.1.53",
)
Dim i
For i = LBound(ipAddresses) To UBound(ipAddresses)
crt.Screen.Send "ssh wh@" & ipAddresses(i) & chr(13) 'ssh登录linux系统账号
crt.Screen.WaitForStrings Array("assword: ", "密码") '输入密码
crt.Screen.Send "L+CHsKtBvdhbc8ga99" & chr(13) '在自动填入密码
crt.Screen.WaitForString "$" '期待响应的字符
crt.Screen.Send "su - root" & chr(13) '切换root
crt.Screen.WaitForStrings Array("assword: ", "密码", "新的 密码:")
crt.Screen.Send "3xhikeDffYFdujeA99" & chr(13)
crt.Screen.WaitForStrings Array("assword: ", "密码:", "重新输入新的 密码:")
crt.Screen.Send "3xhikeDffYFdujeA99" & chr(13)
crt.Screen.WaitForStrings Array("assword: ", "密码:", "重新输入新的 密码:")
crt.Screen.Send "L+CHsKtBvdhbc8ga99" & chr(13)
crt.Screen.WaitForStrings Array("assword: ", "密码:", "重新输入新的 密码:")
crt.Screen.Send "L+CHsKtBvdhbc8ga99" & chr(13)
crt.Screen.WaitForString "#"
crt.Screen.Send "echo " & chr(34) & "3xhikeDffYFdujeA99" & chr(34) & " " & chr(124) & " passwd --stdin root" & chr(13)
crt.Screen.WaitForStrings Array("~]#", "#")
crt.Screen.Send " su - cl-weih" & chr(13)
crt.Screen.WaitForString "]$"
crt.Screen.Send "su - root" & chr(13)
crt.Screen.WaitForStrings Array("assword: ", "密码")
crt.Screen.Send "3xhikeDffYFdujeA99" & chr(13)
crt.Screen.WaitForString "~]#"
crt.Screen.Send "exit" & chr(13)
crt.Screen.WaitForString "~]$"
crt.Screen.Send "exit" & chr(13)
crt.Screen.WaitForString "~]#"
crt.Screen.Send "exit" & chr(13)
crt.Screen.WaitForString "~]$"
crt.Screen.Send "exit" & chr(13)
Next
End Sub

linux新建文件、目录及mask

1、文件转换成文件权限

文件计算权限方法: 
默认666-umask值 若值出现偶数,直接转换权限;若出现奇数,每位奇数+1
例如:umask 123
文件权限:666-123=644

[root@node11 tools]# umask
0123
[root@node11 tools]# touch ceshi04
[root@node11 tools]# ls -l ceshi04
-rw-r--r-- 1 root root 0 Sep 5 23:28 ceshi04

2、目录转成目录权限

目录计算权限方法: 
默认777-umask值 直接转换权限
例如:umask 123
文件权限:777-123=654

[root@node11 tools]# umask
0123
[root@node11 tools]# mkdir ceshi05
[root@node11 tools]# ls -ld ceshi05
drw-r-xr-- 2 root root 6 Sep 5 23:30 ceshi05

SSH版本号修改

[root@localhost ~]# whereis ssh
ssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1.gz
[root@localhost ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
[root@localhost ~]# cp /usr/bin/ssh /usr/bin/ssh.bak
[root@localhost ~]# strings /usr/bin/ssh |grep OpenSSH
OpenSSH_7.4p1
OpenSSH_7.4
OpenSSH_2.3.0*
OpenSSH_2.3.*
OpenSSH_2.5.3*
OpenSSH_3.*
OpenSSH_4*
OpenSSH_5*
OpenSSH_6.6.1*
OpenSSH_6.5,OpenSSH_6.6
OpenSSH*
OpenSSH-2.0,OpenSSH-2.1,OpenSSH_2.1,OpenSSH_2.2
OpenSSH_2.5.0p1,OpenSSH_2.5.1p1
OpenSSH_2.5.0,OpenSSH_2.5.1,OpenSSH_2.5.2*
OpenSSH_2.,OpenSSH_3.0,OpenSSH_3.1*
[root@localhost ~]# sed -i 's/OpenSSH_7.4/OpenSSH_9.4/g' /usr/bin/ssh
[root@localhost ~]# ssh -V
OpenSSH_9.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017