在 github 仓库 指出潜在的安全隐患后 被删 issue

2022-01-03 16:00:28 +08:00
 devliu1
在 github 和 dockerhub 看中了一个比较流行的镜像:hwdsl2/setup-ipsec-vpn 。

简单查看源码时发现作者为了提醒用户升级版本,在脚本中加入了一段代码:

https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/run.sh#L638-L659

这段代码统计了服务器的一些信息( IP 、系统、版本),如果有 0day 爆出,作者有直接利用的可能。

另外,我怀疑这段代码可以绕过,或者在某次更新没有注意又引入了可被绕过的 bug 。

为此新开了个 issue ,作者回复后就立即关闭以及删除 issue 。

不知道大家怎么看?
7370 次点击
所在节点    GitHub
46 条回复
ryd994
2022-01-03 16:19:32 +08:00
swan_ver_latest=$(wget -t 3 -T 15 -qO- "$swan_ver_url")
printf '%s\n' "swan_ver_latest='$swan_ver_latest'" > "$swan_ver_file"
. "$swan_ver_file"

节选三行代码。相信稍有 bash 和或 sql 常识的人都该知道有什么问题。
统计信息可能涉及 gpdr 等 compliance 问题,但是比起上面的问题这已经是小问题了。考虑到 docker 的隔离,影响可能有限。但是如果用 host 网络或者小白瞎挂目录进容器的话就有问题了。总之,这是一个很明显的 bug ,在被人指出后还关 issue 是很不负责任的。

你能做什么?什么都做不了。因为开源软件的授权协议本来就包含了免责声明。作者对用户没有任何义务也不对任何使用的后果负责。你可以考虑 fork 然后修正此问题。这就是开源社区解决不负责任的开发者的方式:fork ,然后比他更负责。

看看 LinkedIn ,好歹也是个 PhD ,毕业后还在业界工作了好几年了。好歹也是谷歌的 sde ,还做过 sre 。G 家的 sre 就这水平?我很失望。
另一方面,LinkedIn 上写的还是 sde 而不是 senior 。PhD 起步,莫不是干了这么多年还没升到 senior ?同龄人应该很多是 principal 了吧?
momocraft
2022-01-03 16:21:18 +08:00
朝那个 URL 放适当的字符串 好像可以在别人的机器执行 (source) 代码
bhyslyk2
2022-01-03 16:22:24 +08:00
你发现了一个后门
learningman
2022-01-03 16:24:44 +08:00
os_type=$(. /etc/os-release
感觉这里可以注入一下,结合一个任意文件写入就可以任意执行 docker 命令了
ryd994
2022-01-03 16:33:54 +08:00
@learningman 这一行反而问题不大。os-release 是通用的系统版本配置文件。https://man7.org/linux/man-pages/man5/os-release.5.html
man page 里的例子就是这样直接 source 使用的

在正常的 Linux 发行版里,/etc/已经合理设置权限,只有 root 或 sudoer 才能修改。如果有人能修改 os-release ,那他何必费这个劲,直接修改 rc.local 或者 init script 还比较方便。
xmumiffy
2022-01-03 16:36:42 +08:00
正常.
issue 是公开的,既然你提出一个漏洞,应该先通过非公开途径报告.
xiaolanger
2022-01-03 16:39:13 +08:00
看到 @xmumiffy #6 这个的回复,楼主是不是可以考虑邮件联系一下作者?
devliu1
2022-01-03 16:41:57 +08:00
Hello! There is no security threat. This code checks for the latest supported Libreswan version. It only runs once after creating the Docker container, and simply shows a message in the Docker container's output that a newer Libreswan version is available.
这个是作者在原 issue 下的回复,藏着掖着还是很失望的。 @xiaolanger
Mirage09
2022-01-03 16:47:18 +08:00
@ryd994 这种加起来 5 yoe 不是 sr sde 挺正常的,更何况还是在升职本来就相对慢的 g 家…
vanton
2022-01-03 16:49:03 +08:00
这种漏洞建议直接私信或者 mail 作者直接联系。
或许事情并不是你想的那样。
jptx
2022-01-03 17:21:22 +08:00
简单看了下,这段是这个 commit 加进去的: https://github.com/hwdsl2/docker-ipsec-vpn-server/commit/4287e068376b9bb81b7781863b203914dd6aa62d
远程加载的地址 dl.ls20.com 是作者自己的域名地址,作者有完全的掌控权且可以不公开内部逻辑。这东西可以类比为某个软件有检查并自动安装更新的功能,是否会出事,完全取决于作者本人的道德。
liuxu
2022-01-03 17:47:17 +08:00
@ryd994

按你贴的代码确实有问题,但是你只截了别人一段代码。。。

别人的源代码是这样的 https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/d305867bccdd70121d079cfa82c8a68c115f469f/run.sh#L638-L659

# Check for new Libreswan version
swan_ver_file="/opt/src/swanver"
if [ ! -f "$swan_ver_file" ]; then
touch "$swan_ver_file"
ipsec_ver=$(ipsec --version 2>/dev/null)
swan_ver=$(printf '%s' "$ipsec_ver" | sed -e 's/.*Libreswan U\?//' -e 's/\( (\|\/K\).*//')
swan_ver_url="https://dl.ls20.com/v1/docker/$os_type/$os_arch/swanver?ver=$swan_ver&ver2=$IMAGE_VER&i=$status"
swan_ver_latest=$(wget -t 3 -T 15 -qO- "$swan_ver_url")
if printf '%s' "$swan_ver_latest" | grep -Eq '^([3-9]|[1-9][0-9]{1,2})(\.([0-9]|[1-9][0-9]{1,2})){1,2}$' \
&& [ -n "$swan_ver" ] && [ "$swan_ver" != "$swan_ver_latest" ] \
&& printf '%s\n%s' "$swan_ver" "$swan_ver_latest" | sort -C -V; then
printf '%s\n' "swan_ver_latest='$swan_ver_latest'" > "$swan_ver_file"
fi
fi
if [ -s "$swan_ver_file" ]; then
. "$swan_ver_file"
cat <<EOF
Note: A newer version of Libreswan ($swan_ver_latest) is available.
To update this Docker image, see: https://git.io/updatedockervpn
EOF
fi

你只截 if 内部的代码,而不贴 if 的代码,也不谈论利用环境。。

首先这个脚本是 sh 执行,不存在其他人通过 http 请求注入问题。。

唯一有问题的是作者给 swan_ver_url 加入了 exploit 代码,但是下面的 if 条件

printf '%s' "$swan_ver_latest" | grep -Eq '^([3-9]|[1-9][0-9]{1,2})(\.([0-9]|[1-9][0-9]{1,2})){1,2}$' &&

首先会通过 grep 验证是否为 xx.xx 的数字版本号,成功才会继续之下&&后面的代码,所以本身就有了防注入功能,而他这个和 sql 注入一点关系都没有,别拿 sql 注入的常识放在这里。。后面就是在当前环境设置 swan_ver_latest 这个环境变量而已。。


回楼主

linux 下软件和系统版本信息放在文件中本身就是很通用的做法。。自己去 /etc 、/proc 和 /sys 下去看。。

你们还在扯 docker 隔离问题,linux kernel 官方自己没隔离 cpu 内存这些信息。。

所以确实不存在安全问题。。
devliu1
2022-01-03 18:09:07 +08:00
@liuxu 确实要看利用条件,我也说明了 `我怀疑这段代码可以绕过` ,我目前还没想道利用的方式,但是直觉感觉可以绕,况且,要是记录版本没必要用 source 的方式,完全可以记录一个 text 。

发 issue 的目的是想留在 issue 区给大家提醒,并审计一下
而发贴是吐槽一下作者直接删 issue 的行为
kkocdko
2022-01-03 18:43:59 +08:00
issue 可以删?
liuxu
2022-01-03 18:49:01 +08:00
@devliu1

作者通过 source 给当前 docker 环境注入一个环境变量没有什么不妥

换个说法,作者建了一座楼,没问题,然后你在楼下拉了个横幅在说“我感觉这楼有安全问题,要塌”,然后作者跟你说没安全问题,把横幅扔到垃圾桶,你觉得这个作者的行为有什么问题么

还是说你感觉不妥,应该继续放楼下展示,给大家提个醒,万一真的会塌呢
kidonng
2022-01-03 18:55:34 +08:00
@kkocdko https://docs.github.com/issues/tracking-your-work-with-issues/deleting-an-issue
但有一大堆爬虫盯着 GitHub 所以删除的作用在一段时间内十分有限
2i2Re2PLMaDnghL
2022-01-03 19:07:17 +08:00
@liuxu 有办法绕过,因为 grep -q 只看输入流中是否有至少一行符合模式。
所以可以让服务器响应载荷如下即可嵌入代码:
999.999.998'
999.999.999
echo "hello world"
w'

它能通过 grep -Eq
在 sort -C -V 中它必是最新
然后通过 printf '%s\n' "swan_ver_latest='$swan_ver_latest'" 输出如下内容:
swan_ver_latest='999.999.998'
999.999.999
echo "hello world"
w''
应该会产生一个错误 999.999.999: command not found ,尔后正常运行其他语句。(没有 set -e )
换句话说其实就是你相信这服务器才行
2i2Re2PLMaDnghL
2022-01-03 19:12:00 +08:00
应该可以不用特意找一个可以找到的 w ,直接 zzzz' 就行
skiy
2022-01-03 19:14:04 +08:00
作者只是为了作统计而已吧?

如果是服务器爆漏洞,通过 IP 和服务器信息就能破别人的服务器?那这样,很多工具没法用了。比如 https://github.com/syncthing/syncthing 这种(也有这种统计)。

再者,用在 docker 上。
楼上有说,如果小白怎样怎么样的。但实际上,小白基本都是按官方文档来的,而官方文档只有一个 `-v ikev2-vpn-data:/etc/ipsec.d ` 挂 volume 里的。

还有一个,楼上有人说,这都是按“作者的道德”什么什么的。但实际上,人家是开源的,你既然觉得人家这个镜像有问题,你完全可以自己 fork 一个出来,再 build 一个挂到 hub docker 上面。如果使用别人的东西之前,就已经作为“作者没道德”的有罪推定,那就不要使用便好。以免自己不放心,也免得作者糟心。
0o0O0o0O0o
2022-01-03 19:17:29 +08:00
> 换个说法,作者建了一座楼,没问题,然后你在楼下拉了个横幅在说“我感觉这楼有安全问题,要塌”,然后作者跟你说没安全问题,把横幅扔到垃圾桶,你觉得这个作者的行为有什么问题么

@liuxu 这是有数十个 pr 数百个 issue 以及 docker pulls 28M 的开源项目,我觉得关闭 issue 和删除 issue 的性质还是不一样的吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825909

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX