macOS 12编译运行proxychains-ng触发SIGKILL强制退出排查
问题:macOS 12 M1 Max环境编译proxychains-ng后启动即被SIGKILL终止
在搭载M1 Max芯片的macOS 12系统上,编译支持Apple Silicon --fat-binary-m1 特性的proxychains-ng(对应支持提交标记为support)后,生成的二进制文件会被操作系统立即强制终止。最初排查方向指向权限问题,但未发现权限异常,即使用lldb挂载调试也无法命中初始断点。
相关操作Shell执行结果如下:
$ git clone proxychains-ng源码仓库 $ cd proxychains-ng $ CFLAGS="-g3 -O0" ./configure --fat-binary-m1 --sysconfdir=/opt/homebrew/etc/ ... $ make $ ./proxychains4 fish: Job 1, './proxychains4' terminated by signal SIGKILL (Forced quit) $ ./proxychains4 ping 1.1.1.1 fish: Job 1, './proxychains4 ping 1.1.1.1' terminated by signal SIGKILL (Forced quit) $ lldb proxychains4 ping 1.1.1.1 (lldb) target create "proxychains4" Current executable set to '~/src/proxychains-ng/proxychains4' (arm64e). (lldb) settings set -- target.run-args "ping" "1.1.1.1" (lldb) b main Breakpoint 1: where = proxychains4`main + 60 at main.c:69:8, address = 0x0000000100003578 (lldb) run error: process exited with status -1 (no such process.)
已确认系统完整性保护(SIP)与Gatekeeper均处于关闭状态:
$ csrutil status System Integrity Protection status: disabled. $ spctl --status assessments disabled
使用ktrace、dtruss工具排查未获取到有效线索,无法定位进程被强制终止的触发原因。
触发原因
核心问题出在--fat-binary-m1编译参数的逻辑缺陷:该参数会强制将编译输出的二进制架构标记为arm64e,但普通用户态环境编译生成的arm64e可执行文件不携带Apple要求的合法代码签名与对应架构权限标记,macOS 12及以上版本的内核会在进程启动的最早期(加载器将控制权交给main函数之前)直接向进程发送SIGKILL终止信号。这也是lldb无法命中断点、跟踪工具抓不到用户态系统调用的根本原因——进程从未进入用户态执行逻辑就被内核销毁。
该问题与SIP、Gatekeeper开关状态无关,即使关闭两类系统防护,内核依然会对签名不合规的arm64e可执行文件执行强制终止逻辑。
解决方案
- 常规编译场景:直接去掉
--fat-binary-m1参数重新编译,默认配置会生成适配Apple Silicon的标准arm64架构二进制,不会触发内核的架构签名校验:
# 清理旧编译产物 $ make clean # 重新配置编译参数,移除--fat-binary-m1 $ CFLAGS="-g3 -O0" ./configure --sysconfdir=/opt/homebrew/etc/ $ make # 验证运行 $ ./proxychains4 -v
- 需要同时支持x86_64/arm64的通用二进制场景:不要使用存在缺陷的
--fat-binary-m1开关,手动在CFLAGS中指定双架构参数编译即可:
$ make clean $ CFLAGS="-g3 -O0 -arch arm64 -arch x86_64" ./configure --sysconfdir=/opt/homebrew/etc/ $ make
编译完成后二进制可正常运行,不会再出现启动即被强制终止的问题。
内容的提问来源于stack exchange,提问作者ylluminate
相关产品推荐
相关产品推荐

