当前位置: 首页 > 刨根问底

黑客能让自动驾驶翻车,也能让它更安全

04-06

搜索“黑客 自动驾驶”,你会发现很多奇怪的报道,就像这样:

黑客能让自动驾驶翻车,也能让它更安全


但我今天要讲的,和这完全反过来,黑客思维也能让自动驾驶系统变得更安全。

请注意,我要说的并不是黑客发现了自动驾驶系统的漏洞,提交给汽车厂商并协助修复,从而让它变得更安全,这种情况经常出现,特斯拉为此还专门搞了一个“安全名人堂”,最近几年中国人的名字经常出现在上面。

但我要讲的并不是这种情况。

黑客能让自动驾驶翻车,也能让它更安全


事情是这样的,如果你在北京五环外开车,偶尔能碰到一些奇怪的车,脑袋上顶着一坨黑黑的东西,它们是无人驾驶汽车,正在路测。

可问题来了,名曰“无人驾驶汽车”,你凑近了看,驾驶舱通常有个人,还不是普通人,都是驾龄五年以上的老司机,他们是安全员,必要时,他们得接管方向盘,脚踩刹车,确保行驶安全。

黑客能让自动驾驶翻车,也能让它更安全


这样的路测有一个很大的问题——不敢在危险的边缘疯狂试探——它们通常慢悠悠地走,比任何人类司机都守规矩。

问题就出在这,如果无人驾驶汽车在测试阶段不去冒险,不去危险的边缘试探,就无法知道自动驾驶系统的能力边界。而车主们买回来无人驾驶汽车,以为十分安全,会去尝试各种极端情况,比如在高速公路上打开自动驾驶模式,然后开始打瞌睡。

可是这些路测的车又不能冒险,一来这些车都很贵,撞坏的代价很高,无法大规模批量做高风险测试。二来一旦出了车祸,很容易搞出大新闻,车就不好卖了。

有没有什么办法,既能大量做高风险测试,又不用承担车祸之后的伤亡损失代价呢?有。

聪明的人类想到一个办法:

把自动驾驶系统放在3D仿真环境里测试不就行了?就像在游戏里那样,从此,妈妈再也不用担心我的车翻到沟里,想怎么玩就怎么玩~

黑客能让自动驾驶翻车,也能让它更安全


其实,仿真环境模拟器已经被广泛应用于自动驾驶系统的测试,各大自动驾驶车厂和研究者都在用。

黑客能让自动驾驶翻车,也能让它更安全

本图截取自模拟器LGSVL

在模拟器的仿真环境里,行车环境可以随意设置,要风得风要雨得雨,白天黑夜随心所欲,事故可以随时复现。在虚拟世界里,根本不怕撞车,不仅不怕,还巴不得撞车,因为仿真器里每发生一次车祸,也许就能避免现实世界的一场车祸。

以知名的模拟器LGSVL为例,它分成两个部分:

1.静态的场景环境,也就是一张大的“游戏地图”,供“车”在里头跑。

2.可编程调整的动态环境,包括天气、光线等自然环境,以及车流、行人等交通情况。

黑客能让自动驾驶翻车,也能让它更安全


于是问题又来了:仿真环境已经有了,研究人员如何在成千上万种可能出现的环境搭配中,找到那些会导致车祸的呢?

讲到这里,我们的主角终于要登场了。

李康是个黑客。这里的黑客并不是指搞计算破坏的人,而是技术高超的网络安全研究者。李康是美国乔治亚大学的终身教授,多次在顶级学术会议上发表计算机领域的演讲,也曾受邀到Black Hat、DEF CON之类顶级网络安全会议上发表演讲。他也是国内最早投身CTF网络安全竞赛的人,是国内知名CTF战队“蓝莲花”的启蒙老师。

之所以跟自动驾驶扯上关系,主要是因为他现在是百度首席安全科学家,而自动驾驶系统是百度的重要业务之一。

怎样在仿真器里找到那些能导致自动驾驶汽车发生车祸的环境配置?这是李康要解决的问题。

作为一个多年网络安全研究者,李康教授想到一门技术:Fuzz。来跟我一起念:发(第四声)子!它是网络安全领域的一门“传统手艺”,黑客们经常用这种技术去挖掘软件漏洞。

Fuzz翻译过来是“模糊测试”,核心理念是“乱拳打死老师傅”,通过不断地生成一个又一个的“输入”,丢到程序里跑,直到程序崩溃或出现异常,然后再去分析崩溃的原因,从而发现漏洞,因为崩溃和异常是存在漏洞的标志。

Fuzz就像是对着一个靶子射箭,只要射得够多,总能射中靶心。

李康发现,这和在仿真环境里找到让汽车出车祸的环境配置,很像。

前者,是随机生成一组输入,造成程序异常行为。

黑客能让自动驾驶翻车,也能让它更安全


后者,是随机生成一个场景配置,使汽车发生危险。

黑客能让自动驾驶翻车,也能让它更安全


于是李康心想,可否从Fuzz技术借鉴一些理念来帮助解决自动驾驶系统的测试问题?他把目光投向网络安全领域最出名的Fuzz工具——AFL。

AFL里最简单的Fuzz模式是 Random Fuzz——随机模糊测试,也就是毫无规律地生成随机输入,测试目标软件的反应。依照这个,李康设计了一个简单的系统,在一个固定的行车路线上对光线、湿度、交通情况进行随机变化。

黑客能让自动驾驶翻车,也能让它更安全


但这种方法就像是蒙着眼睛投篮,显然效率极低,在现实中,黑客们也很少用到AFL的Random Fuzz模式,这种方式的最大问题是没有反馈,不能根据上一次投篮的结果来调整下一次的策略。

但AFL里还有另一种模式:Evolutionary Fuzzing,演化型模糊测试。它的工作流程是这样的:

先生成一批随机输入,作为“种子”,放进程序里跑,收集反馈信息,选出其中更优质的“种子”,以他们为基础进行“变异”,再“种下去”,再收集信息,如果效果更好,就收到种子库里继续测试,如此往复。

因为道理就跟养猪育种、种水稻优选种子一样,这就是为什么叫“演化型模糊测试”,

黑客能让自动驾驶翻车,也能让它更安全


那么,挑选下一代“种子”的依据是什么呢?李康发现AFL的判断依据主要有两个:

  1. 程序是否崩溃

  2. 代码块覆盖率是否提高

前一个很好理解,后面这个需要简单解释一下,AFL把一个程序看作一个大工厂,里头有很多部件、流水线相互协作,大概就像类似:

黑客能让自动驾驶翻车,也能让它更安全


并不是所有输入都会涉及到所有代码块,所谓“代码块覆盖率”,就是一个输入扔进去,会触碰到的代码块,也是黄色部分占总代码块的比例。

黑客能让自动驾驶翻车,也能让它更安全


AFL的理念是,如果一个随机输入的代码覆盖率高,就认为这个“种子”是优质的,因为它碰触到了别的种子没有碰触到的领域,而这些陌生领域意味着新的风险可能性。

至此,恭喜你已经明白了Fuzz工具的基本原理,距离成为一名真正的黑客只差一点点。

黑客能让自动驾驶翻车,也能让它更安全


让我们跟随李康老师的脚步,开始把Fuzzing的思想运用到自动驾驶系统安全验证中。

刚才说到,AFL选择种子的依据有两个:程序崩溃、覆盖率增加。

“程序崩溃”对应到自动驾驶系统当然就是出事故,这毫无疑问,出现过事故的环境配置肯定要收集起来作为重点。

黑客能让自动驾驶翻车,也能让它更安全


但这里需要需要补充一下,由于仿真环境和真实环境的差距,需要排除掉一些非自动驾驶系统错误导致的事故,比如你的车好好地停在那忽然有个别的车撞上来,或者仿真环境本身出问题导致的事故。

“覆盖率增加”应该对应什么呢?李康首先想到了“车辆与障碍物的最小距离”,道理很简单,如果每一次都优选出距离更近的环境配置作为“种子”,就很可能最终找到那些能让距离变成0(也就是撞上去)的配置。

黑客能让自动驾驶翻车,也能让它更安全


让我们看一看运行程序后会发生什么。

初始参数设置为光线明亮道路整洁,汽车就这么在里头跑啊跑,路上有一辆卡车,但每次都没撞上。

黑客能让自动驾驶翻车,也能让它更安全


渐渐地,Fuzz程序开始把光线调暗,直至最暗,虽然仍没撞上,但是停车距离不断缩短。直到Fuzz程序又加了一个“地面湿滑”的参数,终于撞上。

黑客能让自动驾驶翻车,也能让它更安全


这就是一个简单的,用碰撞距离来驱动选择的结果。

可能有人会说:“这跟人工去调节也没多大区别呀!”是的,人类研究员通过逻辑判断也能自然而然地想到把灯光调暗,让道路变得更湿滑等等。

于是我们需要再换一个“优选种子”的规则,以进一步提高Fuzzing的反馈效率。

李康发现,Fuzz探索一个程序的执行路径有点类似于一辆车在路上的行车路径:

黑客能让自动驾驶翻车,也能让它更安全


李康把这种方法命名为:AI security Fuzzing 简称ASF


基于这一点,李康想到把“汽车的行动轨迹”作为反馈信息,如果经过一次变异,会导致覆盖的路径信息有显著的变化,那么就认为这是一个“比较有意思的”、”值得变异”的种子。

黑客能让自动驾驶翻车,也能让它更安全


让我们继续尝试。

自动驾驶汽车前方的车辆很慢,于是它打算向右变道,超车。

黑客能让自动驾驶翻车,也能让它更安全


此时Fuzz程序让右后方开来一辆车,会大幅影响到自动驾驶汽车的行车覆盖路径。于是Fuzz程序就会把这种情况作为新的“种子”,继续进行“变异”和输入。

通过调整后车的行驶位置和车速,蓝色的轨迹会不断发生改变。

黑客能让自动驾驶翻车,也能让它更安全


当后车的位置和车速“变异”到某一个特殊值时,自动驾驶车辆也许是为了避让后车,忽然向左转向,撞在道路护栏上,bingo,在Fuzzing程序用各种姿势蹂躏之下,自动驾驶系统终于招架不住,出了一起事故。

黑客能让自动驾驶翻车,也能让它更安全


此时研究人员就可以基于这个风险场景来回溯原因,最终发现自动驾驶系统没有启用某一条借道的交规检查,从而提高自动驾驶系统的可靠性。

但是这种仿真测试可以作为现实世界测试补充,就像黑客在寻找软件漏洞的时候并不会只依靠FUZZING,而是把它作为一种补充,期待它可以帮助黑客发现一些人很难发现的问题。

黑客在挖漏洞时,通常不会只用Fuzz这一种方法,黑客们往往把Fuzz作为一种补充方法,因为它有时可以“大力出奇迹”——发现一些人类依靠逻辑很难找到的漏洞。同样,自动驾驶安全领域也会成为一个有力的技术补充。

李康教授说,通过这种仿真的方式,研究人员可以基于现实世界中曾经发生过的自动驾驶事故场景来仿真,也可以复现其他公司的自动驾驶测试案例报告,并通过上述的 Fuzzing 等方法来收集各种危险场景,最终让这些危险场景停留在虚拟世界里。

黑客能让自动驾驶翻车,也能让它更安全


但同时他也强调,仿真虽然对自动驾驶汽车测试很有帮助,便于重放和调试,但是并不能完全替代真实环境的测试,毕竟仿真环境和真实环境还是有差别的,并不是说在仿真环境里测试没问题,在真实的环境里就一定没问题。

目前整个自动驾驶领域都在着力优化仿真器,之后百度安全也会发布相关的技术成果。

黑客能让自动驾驶翻车,也能让它更安全


最后,我想说一个观点。李康教授能把网络安全领域的Fuzzing技术理念迁移到自动驾驶领域,是因为他有很强的知识迁移能力。

这让我想起,很多创新都源自于跨界知识迁移。巴菲特的合伙人查理芒格主张“跨学科教育”,他认为许多时候A领域的知识常常能帮助解决B领域的问题,人不应该把自己限制在某个单一领域。

乔布斯年轻时学设计,他一度认为这对他的公司没什么用,可是后来苹果受益于此。

国内的许多科技大佬也是如此。张一鸣曾说《基础生物学》对他的影响很大,王小川,马化腾也都是生物学思维的信奉者。

“深度学习之父”杰佛里·辛顿曾是一位心理学家、哲学研究者,他想研究人类的记忆、思维、感知,后来他觉得如果要研究明白大脑,不妨自己做一台大脑,他就研究出独特的深度学习。

“他山之石,可以攻玉。”古人诚不欺我。

---

注:本文后半部分的技术知识演绎自李康教授在DEF CON CHINA PARTY的演讲《模糊测试在自动驾驶安全中的应用》,未经其本人确认,如有转述错误,请联系作者修改。


文 | 木子Yanni

嗨,这里是浅黑科技,在未来面前,我们都是孩子。

想看更多科技故事,欢迎戳→微信公众号:浅黑科技。