Perl 语言的发明人 Larry Wall 曾说,优秀程序员应该有三大“美德”:懒惰、急躁和傲慢。其中,懒惰直接作为了程序员的“第一美德”——因为懒得做一些重复低效的工作,优秀程序员会花时间研究如何把工作变得高效省力。
近来,一位来自英国的 17 岁少年 Alistair Smith 就很好地体现了这一“美德”:因为懒得写网课作业,Alistair 联合朋友对线上平台进行逆向工程,然后搞了个脚本“开挂”。
用脚本跳过 20 分钟的网课视频
据 Alistair 介绍,早在 2018 年他所在的学校就开始使用一种名为 HegartyMaths 的全新在线作业平台。老师会在这个平台上选择一个主题作为家庭作业,学生则要观看关于该主题的一个 10-15 分钟的网课视频(观看的同时还要写笔记),并完成一个简短的测验。
对此,Alistair 抱怨道:“听起来很简单,但实际上这很费时间,尤其是测验,在最坏的情况下可能需要一个小时才能完成一个主题。”
正如开头所说,懒惰这一“美德”很好地体现在了 Alistair 身上:为了逃避写作业,想把更多时间用在打游戏和敲代码上,Alistair 找了他的密友 Scott Hiett,打算一起研究怎么把这个网课作业“翘掉”,而突破口自然是 Hegarty 这个在线学习平台。
通过对前端应用进行逆向工程,Alistair 和 Scott 想出了用 Tampermonkey 用户脚本。该脚本可以让嵌入式 YouTube 播放器出故障,显示用户已经观看了至少 1 次视频,最重要的是老师也能看见这个数字——也就是说,这个脚本能让学生跳过 20 分钟的观看视频时间。
之后一段时间,Alistair 学校的许多朋友都找他要 Tampermonkey 脚本跳过网课视频,后续在多次使用中,Alistair 发现甚至可以把观看次数设为 9999 次:“不过每次我们这样做时,我们的帐户都会被 Hegarty 团队重置。”
200 行代码库,收集所有测验答案
到了 2018 年 11 月,Alistair 向他们的数学老师报告了这一漏洞,并让她向 HegartyMaths 发送邮件同步,结果 Hegarty 团队给予的回答是:“虽然我们会调查他(Alistair)发现的任何问题,但我们更希望他专注于数学,而不是试图利用这个机会。”
在收到这封邮件后,Alistair 坦言:“这个回应让我们有点兴奋,因为他们现在知道我们在捣乱网站,但似乎无意修复我们知道这个小漏洞,所以我们可以继续利用它。”
成功找到 HegartyMaths 的漏洞后,Alistair 很快就将目标转向了另一个名为 Educake 的线上学习平台,其主要用于生物、化学和物理教学。
Hegarty 和 Educake 之间有一个共同机制,即一旦答错了问题,系统会立即给出正确答案。利用这一特点,Alistair 和 Scott 编写了一个 node/mongo 应用和 Tampermonkey 脚本来检测用户何时在测验页面上,并用随机数回答每个问题,然后将正确答案存储在 mongo 数据库中。
其中,Alistair 透露 TamperMonkey 脚本大概类似于下列代码:
const guess = Math.random();
const result = await post(‘/api/answer’, {
body: {
answer: guess,
},
});
await post(‘http://localhost:8080/save’, {
body: {
question_id: question.id,
answer: result.success ? guess : result.correct_answer,
},
});
Go to next question and repeat code above
nextQuestion();
“正如你所看到的,它实际上是每个问题的循环,保存了我们得到的正确答案并继续推进。”在收集到正确答案后,Alistair 他们还添加了一些从数据库获取的功能以及对多项选择的支持,最后将其全部捆绑到一个简单的 Handlemonkey 脚本中,并上传至 Snapchat(一款支持“阅后即焚”的即时社交软件)供别人使用。
Alistair 自豪表示:“最终结果?一个大约 200 行代码库,收集了线上学习网站上的所有问题和答案,每次测验都能重复获得 100% 的准确率,还有一个 15mb 的 mongo 数据库。”
这初步的成功给了 Alistair 很大动力,因此他又找到了一位名为 Jake 的网友,并和他一起抓取了 Hegarty 的整个数据库:“我们有了一个可以与 Hegarty 公司本身价值相当的 JSON 文件,因为整个产品实际上就是我们复制的数据库。”
在这些基础上,Alistair 他们制作了一个 Chrome 扩展程序 Mochip。总体而言,Mochip 集合了他们抓取的 Hegarty 和 Educake 数据库,托管在 Heroku 免费层和 MongoDB Atlas 免费层上,用户可以登录,输入问题并获取 Mochip 对该问题的答案列表。
最终大翻车,被 Hegarty CEO 发现
不想写作业的学生何其多,因此 Mochip 的用户群在短时间内便迅速扩大,甚至最终还有了一个 Discord 服务器——一切看起来都很顺利,直至 Hegarty 的 CEO Colin Hegarty 上网搜到了 Scott 发布的一则关于 Mochip 的 Reddit 帖子。
在尝试 Mochip 并发现它确实能用后,Colin Hegarty 大感震惊,但却并未因此恼怒或起诉,而是发了一封邮件给 Alistair 想约时间聊聊:
“我对你做这件事的技能和能力印象深刻,我想你和你的朋友们一定非常聪明。我最初成立 HegartyMaths,是试图帮助孩子们在生活中学习和进步……我希望有机会和你谈谈你开发的应用。我们能不能在周末前约个时间聊一聊?有时候遇到这样的情况,有的公司可能会采取法律手段来处理,但我更愿意和你聊天,以友好的方式解决这个问题。”
收到这封邮件后,Alistair 直言“很沮丧,但也有点满足”——在某种程度上来说,成功吸引 Colin Hegarty 本人的注意也算是一件蛮厉害的事。
在之后约定的线上聊天中,Alistair 和 Scott 先后与 Colin Hegarty 和 Educake 团队分别都进行了对话,并主动给出了防止再次出现这种情况的完整解决方法:首先,使用 Redis 实现一个简单的速率限制,这将使自动化测试变得非常困难;其次,打乱数据库中的 ID,尽可能使克隆的数据库无效。
待一切尘埃落定后,Alistair 反省道:“我特别想感谢传奇人物 Colin Hegarty 在与我联系时的善意和体贴。如果不是这样,事情的结果对我来说可能会更严重。HegartyMaths 是一个出色的学习资源,归根结底,它是为了帮助学生学习而不是带来不便。”
Alistair 将这起事件整体复盘后,其文章在 HN 上引起了热议。部分网友称赞 Colin Hegarty 友善的处理方式,有网友认为“这种经历可能比 Alistair 躲过的网课作业更有价值”,也有网友说:“大部分学生可能真的需要这些作业来巩固学习,而这种应用会削弱他们在这方面的能力。”
对于这件事,你的看法又是什么呢?
参考链接:
https://alistair.blog/mochip
https://news.ycombinator.com/item?id=32945906
— 推荐阅读 —