GitHub检测到Gemfile.lock中loofah、Nokogiri间接依赖漏洞,该如何处理?
别担心,这种间接依赖引发的漏洞告警在Ruby项目里太常见了,我给你梳理几个靠谱的解决步骤:
1. 先搞清楚谁引入了有问题的依赖
首先得明确是哪个直接依赖把漏洞版的loofah和Nokogiri带进来的,用bundle的树形展示命令就行:
bundle show --tree loofah bundle show --tree nokogiri
执行后你会看到类似这样的输出:
loofah (2.0.3)
crass (1.0.6)
nokogiri (1.7.0.1)
rails-html-sanitizer (1.0.3)
loofah (2.0.3)
actionview (5.0.1)
rails-html-sanitizer (1.0.3)
这样一眼就能看到是哪个上层gem牵线引入了旧版依赖。
2. 优先更新上层直接依赖
如果那个引入问题依赖的直接gem已经有更新版本,并且新版本里已经替换了安全版的loofah/Nokogiri,那这是最优解。比如刚才例子里的rails-html-sanitizer,你可以查它的最新安全版本,然后修改Gemfile里的声明:
# 假设原来的是 gem 'rails-html-sanitizer', '~> 1.0.3' gem 'rails-html-sanitizer', '~> 1.4.0' # 换成安全的版本
然后执行:
bundle update rails-html-sanitizer
这样bundle会自动把间接依赖的loofah和Nokogiri更新到安全版本。
3. 强制指定安全版本的间接依赖
如果上层直接依赖还没更新,那你可以直接在Gemfile里强制声明安全版的loofah和Nokogiri,bundle会优先使用你指定的版本(只要没有版本冲突):
# 先查清楚这两个gem的最新安全版本,比如loofah>=2.3.0,Nokogiri>=1.8.5 gem 'loofah', '>= 2.3.0' gem 'nokogiri', '>= 1.8.5'
然后执行:
bundle install
如果没有版本冲突,Gemfile.lock里的版本就会自动更新到你指定的安全版。
4. 处理版本冲突的情况
如果强制指定版本后出现冲突提示,比如某个其他依赖要求Nokogiri必须低于1.8.0,那你可以尝试用保守更新命令,尽量少改动其他依赖:
bundle update --conservative loofah nokogiri
要是还是不行,就得权衡一下:要么找冲突依赖的兼容版本,要么暂时忽略(但不推荐,漏洞还是存在),或者等冲突依赖的维护者更新版本。
5. 验证漏洞是否修复
最后一定要确认问题解决了,推荐用bundler-audit工具检查:
# 先安装工具 gem install bundler-audit # 更新漏洞库并检查 bundle audit check --update
如果输出里没有loofah和Nokogiri的漏洞告警,就说明修复成功了。
内容的提问来源于stack exchange,提问作者user3630282

