在容器中打开的代码如何在容器外执行任意代码?

Mic*_*ltu 5 visual-studio-code vscode-remote

我通常在 Docker 容器内工作,既保持本地环境清洁,又沙箱。但是,当我使用 VSCode 远程容器尝试打开容器中的文件夹时,我被告知:

打开开发容器中的文件夹可能会在容器内部和外部执行任意代码。

在此输入图像描述

不幸的是,文档链接仅总体讨论了工作区信任,而没有提及任何有关容器的风险。

在开发容器中工作时,单击“信任文件夹并继续”会带来哪些具体风险? 通过单击此处的“信任”,我会面临哪些攻击媒介?除了在容器内部工作之外,我可以在 VSCode 中做些什么来减轻风险(例如,我可以禁用某些特定功能)吗?

zor*_*ori 2

这让我很好奇可能会出现什么问题,并且我找到了一些无需用户交互即可出去的方法

1. 滥用tasks.json

我认为它非常酷的功能可能会导致"runOn": "folderOpen"在主机上执行任意代码,看看这个例子

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "start browser",
            "type": "shell",
            "command": "C:\\Progra~1\\Google\\Chrome\\Application\\chrome.exe https://stackoverflow.com",
                "runOptions": {
                "runOn": "folderOpen"
            },
            "dependsOn": ["back"]
        },
        {
            "label": "back",
            "command": "${command:remote-containers.reopenLocally}"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

您可能觉得在容器内运行任务是安全的,但是这个任务做了两件事

  • 打开时无需用户交互尝试返回本地计算机
  • 然后打开浏览器并打开stackoverflow.com

如果只需要信任此文件夹,那么带有选项的任务"runOn": "folderOpen"将在无需您交互的情况下被触发

另一件事是,由于您的主机目录和 docker 内部的目录始终同步,因此它可能会修改自己的文件(包括tasks.json),然后尝试执行它

2. 滥用features/docker-outside-of-docker

如果您正在运行开发容器,您可能会开始使用其他功能,其中之一称为docker-outside-of-docker

    "features": {
        "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {}
    }
Run Code Online (Sandbox Code Playgroud)

如果 Dev Container 是完全远程的机器,也许你的主机不会被触及,但运行 docker 的机器可能会损坏

然后我们可以创建类似的任务

        {
            "label": "list host",
            "type": "shell",
            "command": "docker run --rm -v /:/host alpine whoami && cat /etc/passwd"
        }
Run Code Online (Sandbox Code Playgroud)

并在主机上执行任何操作root


如果我们转到您提到的文档链接,我们可以在那里找到

限制模式尝试通过禁用或限制多个 VS Code 功能的操作来阻止自动代码执行:任务、调试、工作区设置和扩展。

您可以清楚地看到,这些功能tasks与其他 VS Code 功能一起被禁用,这些功能可能会导致任意代码执行。

我没有尝试,但看看看起来launch.json也可以看到任何 shell 代码都可以执行,所以即使没有tasks但有 Docker 主机访问也可能会损坏它,即使没有这个容器也可以访问你的本地网络并尝试攻击你的路由器、打印机或其他 PC,如果它们打开了某些端口,我知道它会变得很长,但有可能,请看一下三角测量操作:最后一个(硬件)之谜,尤其是这张图片 (https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2023/12/25130925/trng_final_mystery_en_01.png) 可以多长时间

因此devcontainer.json, 、tasks.jsonlaunch.json位于工作区内部并包含可执行代码,因此它们必须是可信的