2018年,我坐在同事D对面。他每天午饭都不锁屏,屏幕大敞着离开。我提醒过两次,他笑笑,第二天照旧。
于是我用12行Python,给他上了第三课。
![]()
macOS自带一个叫say的命令行工具——把文字输进去,电脑就会朗读。不是耳机里,是外放。整个办公室都能听见。
计划很简单:趁D吃午饭,溜到他工位,后台跑一个微型HTTP服务器。然后坐回自己座位,用GET请求往他电脑里塞文字,让它当众喊出来。
代码就这些:
from subprocess import check_output from aiohttp import web async def handle(request): name = request.match_info.get("name", "") text = name check_output(f"/usr/bin/say '{text}'", shell=True) return web.Response(text=text) app = web.Application() app.add_routes([web.get("/{name}", handle)]) web.run_app(app, port=6063)
12行。没认证。没限流。没输入校验。后面会讲这有多危险。
午饭时间,我在他MacBook上运行python server.py &,走回座位。然后隔空curl:
curl http://<他的电脑>:6063/hello
他的MacBook, unattended地坐在桌上,用机械女声说了句"hello"。
全组回头。D还在大楼另一头吃三明治。
接下来40分钟,我测试了边界:
curl http://.../I-forgot-to-lock-my-screen
curl http://.../please-lock-my-laptop
curl http://.../this-is-what-happens-when-you-do-not
say会把连字符当单词处理。这台笔记本当众宣布了自己的失职。大家停下工作听它"自白"。
D回来,盯着电脑看了10秒,骂了句我不会写在这里的话,扑向菜单栏。但服务器还在跑——因为我用了&后台运行。关终端没用。他得手动kill PID。那天下午他学会了lsof -i :6063。
恶作剧好笑。背后的漏洞不好笑。
这12行服务器,就是一台未锁屏MacBook在30秒物理接触下的真实写照:
第一,能执行任意shell命令。check_output(shell=True)配合用户输入,是教科书级的命令注入。恶作剧里我控制两边;真实攻击中,攻击者也控制两边——因为他们拿着你的电脑。
第二,不需要密码。Python解释器现成的。Homebrew现成的。curl现成的。SSH密钥现成的。浏览器保存的密码,在已登录会话里可直接解密。
第三,锁屏后服务器继续运行。一旦启动,锁屏没用。进程持续监听。攻击者持续操作。
第四,你发现不了。端口6063的Python进程不会出现在Dock,不会弹通知。活动监视器里混在一堆进程里,普通人根本不会看。
八年过去,D现在每次离开都锁屏。
有些安全习惯,提醒两次不够。得让电脑亲自开口说第三次。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.