- 登录鉴权要自己打开。 设置环境变量
OSA_PASSWORD后,除登录页、分享链接、webhook 和前端静态文件外,页面、接口和 WebSocket 都要先登录; 只有一个密码,没有多用户和权限区分。不设置时不用登录,能访问到这个端口的人就能和你的 Bot 对话、操作电脑、使用你接入的应用, 这时请只在本机或内网(例如 Tailscale)使用。部署到公网时务必设置一个足够长的随机密码,并通过 HTTPS 访问。 - 服务器锁(
security.local_exec: false):登录密码只管能不能用这个应用。电脑选“本机”和本机终端、自定义启动命令的应用 (以及改应用的命令、参数、环境变量)、“文件夹”应用指到工作文件夹以外、应用配置引用服务的环境变量,这几样等于把服务所在的机器交出去。 部署到公网服务器时请打开服务器锁,这样密码万一泄露,别人也拿不到服务器。打开后应用市场里的应用照常能用(只认随项目发布的清单里原样的命令), 检查放在启动应用进程之前,恢复备份带进来的配置也一样挡住。只能在服务器上的config.yaml里改。 想分开管时用两个策略键:security.exec(host/sandbox/off)、security.apps(any/market)。 写了以写的为准,不写按local_exec/demo推(见 docs/configuration.md), 写错的值按最严的算。注意apps: any允许自定义启动命令,等于能在服务器上跑任意代码,和exec: host一样要慎重。 - 服务进程里只跑随项目发布的代码:应用(MCP)在自己的进程里,
run_code在沙箱里。旧版本的开发者插件已经去掉, 留下的data/plugins文件夹不会被读取,config.yaml里的security.plugins也不再起作用。 - 演示模式(
security.demo: true):给登录密码公开出去的演示服务器。在服务器锁之外,还不能用在服务器上运行程序的应用(npx / uvx)和自定义应用、 不能用本机或内网的模型服务地址、不能改用量上限、不能导出或恢复备份。演示服务器上大家共用一份数据,不要在上面填真实的密钥和账号。 建议再用系统层面兜底:单独的普通用户、只能写自己的数据目录(见deploy/demo/osa-demo.service)。 - 模型服务换了地址(主机或端口)时要重新填 API Key,“检查”也只会把存着的密钥发给原来那个地址:不然改个地址,密钥(可能是服务环境变量里的)就发到了别人那里。
- 登录状态是一个签了名的 HttpOnly cookie(SameSite=Lax,HTTPS 下带 Secure),签名密钥在
data/session.key。同一个 IP 10 分钟内输错 5 次会暂停登录。 - 来源(Origin)和本站不一致的写请求与 WebSocket 一律拒绝,不管开没开登录,webhook 也一样。所以你在浏览器里打开的网页,没法连上本机的服务替你发消息、处理确认卡片。
- 没开登录时,只接受用
localhost、IP 地址、*.local、*.ts.net和server.allowed_hosts里的名字访问,防 DNS rebinding(别人把自己的域名解析到 127.0.0.1,借你的浏览器读写本机的服务)。 - 本地电脑的 VNC 没有密码,只监听电脑容器里的 127.0.0.1,不映射到宿主机端口,由服务端经
docker exec转发给浏览器。电脑里 Chromium 的 DevTools 端口(9222)只监听电脑内部,也不做端口映射。 - 用 Docker Compose 部署时,服务的容器挂了宿主机的
docker.sock(本地电脑要用),等于有宿主机的 root 权限;服务里运行的第三方应用(MCP)也在这个容器里,请只添加信得过的应用。电脑用 Instabox 时可以去掉这个挂载。 - 模型提供方的密钥只从环境变量读取。应用密钥可以存进保险库:用 Fernet 加密写进数据库,主密钥来自
OSA_VAULT_KEY或data/vault.key(权限 600)。两样都要妥善保管,data/不进 git。 - 接口和模型只能看到保险库里密钥的名字;明文只在启动应用时注入它的进程环境变量。
- 设置了
OSA_WEBHOOK_TOKEN后,webhook 必须带上X-OSA-Token才会被接受;没设置时只接受本机请求。 - 电脑里的浏览器登录状态由所有 Bot 共享,请留意让它登录了哪些账号。
- 页面的分享链接(
/s/<token>)只是一个不可猜的地址,取消分享后失效。没设置OSA_PASSWORD时,“未分享”的页面同样能被访问到这个端口的人看到。 - Bot 生成的 HTML 页面在沙箱里显示:带 CSP 的
sandbox和connect-src 'none',脚本拿不到本站的数据,也不能调接口或连 WebSocket(服务端还会拒绝来源为null的 WebSocket)。 - 资料库的文件接口只能访问共用电脑的工作文件夹(Docker / Instabox 里的
/data/workspace,本机是data/workspace)。 - “演示一遍”会记下你在浏览器里点了什么、输入了什么。密码框和名字像密码、验证码、卡号的输入框只记
******,但这是按输入框判断的, 录制时请不要在普通输入框里填敏感信息。录到的步骤会交给模型写技能草稿。 - 网页里的提示注入:Bot 读到的网页、邮件、webhook 内容里可能藏着“去做某事”的指令。对此有两条防线:
fetch_url默认不抓本机和内网地址(回环、内网、链路本地、云服务器的元数据地址169.254.169.254、100.64/10),解析到内网的域名和跳转到内网的也挡住; 要抓内网页面在config.yaml里设tools.fetch_private: true。检查和真正连接之间域名还可能换地址(DNS rebinding),这一点没有防。- 写操作要先过确认卡片(见设置里的确认规则)。卡片上的“本次任务内允许”只记在内存里,到这个任务结束(做完、失败、取消)为止;
“总是允许”生成一条规则。规则可以按参数写(
filesystem__write_file:/data/workspace/*),比的是 schema 里排第一个的文字参数 (不按模型给的顺序),以/开头的先把..化掉;但不解析符号链接,也不懂各个工具自己的参数语义,按参数放行只是减少打扰,不是可靠的边界。
- 电脑里能连到什么:
- macOS 的 Docker Desktop 上(2026-11-06 实测),本地电脑能通过
host.docker.internal连到宿主机上只监听 127.0.0.1 的服务, 宿主机看到的来源也是 127.0.0.1,和你自己的浏览器分不出来。所以在 Mac 上不设OSA_PASSWORD时,Bot 在电脑终端或浏览器里能直接调用本服务的接口 (包括处理确认卡片),网页里的提示注入可以借此绕过确认。用 Docker Compose 跑、端口映射到 127.0.0.1 时应该也一样(没有单独测)。 在 Mac 上用本地电脑时请设置OSA_PASSWORD,或改用 Instabox。桌面 App 独立运行时服务本来就开了登录(随机密码),这一条不受影响; 但 Mac 上别的只监听 127.0.0.1、又没有密码的服务(开发服务器、数据库、本地代理的控制接口等),选“Docker 沙盒”时 Bot 一样能连到。 - Linux 上(按 Docker 默认的网络隔离推断,没有实测):电脑容器在默认网络里,连不到宿主机只监听 127.0.0.1 的端口,也连不到 Docker Compose 网络里的服务容器;
但在云服务器上一般能连到云厂商的元数据地址(阿里云
100.100.100.200、腾讯云、AWS 的 IMDSv1 等)。服务器绑了带权限的角色时,请改用 Instabox 或在云厂商那边关掉元数据访问。
- macOS 的 Docker Desktop 上(2026-11-06 实测),本地电脑能通过
- 本机(
computer.backend: host):Bot 直接在你的电脑上操作,边界是这样划的:- 浏览器用单独的配置目录,看不到你日常 Chrome 里的登录状态、密码和历史;你在这个 Chrome 里登录的账号所有 Bot 都能用。
- 调试端口只听 127.0.0.1、端口随机,不允许网页连(没有
--remote-allow-origins);但这台电脑上的其他程序能连上它,和本机别的开发工具一样。 - Bot 读写文件、往网页上传文件只能在工作文件夹里(经符号链接跑出去的也不行)。终端默认关;打开后命令能访问你能访问的所有文件,
所以每条命令都要你确认,命令的环境变量里去掉了名字带 KEY、TOKEN、SECRET、PASSWORD 的变量和
OSA_*。卡片上可以“总是允许这个前缀” (默认是命令的第一个词,能改),生成一条computer_shell:git *这样的规则;本机终端只认这种带前缀的规则(以前的computer_shell、computer_*不放行它), 命令里带;&|`$()<>或换行的照样每次问。前缀是按字面比的,git *也放行git -c core.pager=… log这类能执行别的程序的写法;bash、sh、python、node、sudo、env、xargs这类前缀等于全放开,不要用。“本次任务内允许”在这个任务里整个放开终端(带符号的也不问),任务结束就失效。 - 上传文件、写文件、“提交”默认先问。“提交”是按按钮上的字和表单类型猜的(见
cdp_helper.INSPECT_JS),会漏也会多问,不能当成可靠的防线; 真正有后果的操作仍然靠 Worker 的ask_approval和你的确认规则。 - Bot 的浏览器和服务在同一台电脑上,能打开本服务的网页。没设
OSA_PASSWORD时它能像你一样处理确认卡片,网页里的提示注入可以借此绕过确认。 桌面 App 自动设了随机密码(存在钥匙串里),Bot 的浏览器没有登录,不受影响;自己用uv run跑、电脑用本机时请设置OSA_PASSWORD。
- 操作整个屏幕(本机是 Mac、给了“辅助功能”和“屏幕录制”权限时):Bot 用的是你真实的屏幕、鼠标和键盘,能做你在这台电脑上能做的事,
包括打开终端执行命令、改系统设置,本机终端的“每条命令都确认”这时管不住它。所以:
- 没给权限就只用浏览器(
computer.host_desktop: false可以整个关掉);每个任务第一次用先问你;点“发送 / 付款”这类按钮、在多行输入框里回车先问(按按钮上的字和输入框的类型猜,会漏也会多问); - 你一动鼠标键盘 Bot 就停下;屏幕锁着不操作;不点、不往 Open Super Agent 自己的窗口里打字(按进程和窗口标题判断, 你用别的浏览器开着本服务的网页时,标题里有“Open Super Agent”才认得出);
- 截图会把屏幕上看得到的一切发给模型服务,包括别的 App 里的聊天记录、密码管理器里露出来的内容。用之前把不想让模型看到的窗口关掉或最小化;
- 网页、文件里的提示注入能借它做更多事。只在你看着、或者信得过任务内容时打开,用完可以关掉。
- 没给权限就只用浏览器(
- 服务器借用你的 Mac(电脑类型 linked):Mac 上的 App 主动连到服务器,凭据是服务器发的随机令牌(服务器只存 SHA-256,Mac 上存在钥匙串里),
选回“Bot 电脑”或在 Mac 的菜单栏里断开就作废。借出去之后,能登录服务器的人就能让 Bot 用这台 Mac:Bot 的浏览器(包括你在里面登录过的网站)、
工作文件夹里的文件,以及屏幕和鼠标键盘(Mac 给了权限时;每个任务第一次用屏幕的确认卡片,登录了服务器的人也能点),所以服务器一定要设登录密码。边界:
- 借出要在 Mac 上点弹窗同意,服务器自己做不到;路径在 Mac 上再查一遍,只能在工作文件夹里;你一动鼠标键盘 Bot 就停下。
- 终端默认关(
computer.linked_shell),在电脑面板里打开,哪台登录了的设备上都能开。打开以后能登录服务器的人就能在这台 Mac 上用你的账号执行命令: 每条命令的确认卡片在服务器上,登录了服务器的人也能点。命令的环境变量里去掉了密钥,但命令本身能读你能读的所有文件。 开关故意不只放在 Mac 上:Mac 给了屏幕权限时,Bot 本来就能打开“终端” App 打字,只在 Mac 上能开挡不住什么,反而让你人不在 Mac 前时用不了。 借出这台 Mac 就是信任这台服务器;不想这样就别借,或者只在需要时借、用完在菜单栏里断开。 - 服务器锁(
security.local_exec: false、security.exec)不拦它:动手的是你的 Mac,不是服务器。演示模式下不能借用。
- 推送内容(标题和一两句摘要)经浏览器厂商的推送服务转发,按 RFC 8291 端到端加密,推送服务只看得到密文和设备地址。VAPID 私钥存在数据库里。
- iPhone App 的推送多经过一个推送中转(
push.cclsp.top,代码是osa/relay.py)再到苹果,加密方式不变,中转和苹果都只看得到密文。 中转看得到的是:手机的推送令牌、手机和服务器的 IP、服务器的推送公钥、推送的时间和大小;它不写访问日志,90 天没成功推送过的地址自动清掉。 解密的钥匙只在手机的钥匙串里(App 和通知扩展共用,首次解锁后可读,不同步到别的设备)。详见 iPhone App → 推送。 - 桌面 App 和 iPhone App 只给服务器的网页界面(
/、/apps、/library)调用 App 功能(通知、角标、打开链接、推送订阅……)的授权; Bot 生成的报告页不会成为主窗口里的页面,在 iPhone App 里改在弹出页中打开,调不到这些功能。扫码配对用的登录票 5 分钟内有效、只能用一次。
请不要为安全问题公开提 issue。请通过 GitHub 的 Private vulnerability reporting 私下报告。