郑昀 创建于2017/9/29 最后更新于2017/10/6

提纲:

  1. 阿丽亚娜火箭的解体

  2. 阿波罗飞船的P01模式

  3. 德勤的Google+

  4. 麻省理工的500英里邮件

又到了扶额兴叹的节气。(前文回顾:5年前的今天,一个小小的部署错误,让美股最大交易商坠入深渊

0x00 阿丽亚娜火箭的解体

1996年6月4日,阿里亚娜五号火箭首次测试发射。

37秒后,火箭水平翻滚,解体爆炸。

WHY?

Ariane 的开发语言是 Ada,美国军方软件开发强制语言,。

设计 Ariane4 火箭的时候,设计师们坚信水平速率是不会超过一个16-bit signed integer 的。

但 Ariane5 火箭的水平速率比 Ariane4 高出了5倍,code review 时,大家都没有注意到这一点。

16位整型的范围是 -32768 到 32767。

出错的代码是:

horizontal_veloc_bias := integer(horizontal_veloc_sensor);

昀哥查了查事故报告,引发问题的是 BH, Horizontal Bias。

这个值与时间有关,还不是纯水平速度。

因为 Ariane5 的早期轨道与 Ariane4 不同,所以这个 BH 比预想的高了很多。

结果导致数据转换时溢出。

控制惯性导航系统的计算机向控制引擎喷嘴的计算机发送了一个无效数据。

于是火箭偏离它的飞行路径,解体并爆炸。

嗯哼,所以有一个段子说,如果阿丽亚娜火箭的开发语是 JavaScript,就不会发生这个惨案。

0x01 阿波罗飞船的P01模式

话说史上最牛的女程序员玛格丽特·希菲尔德·汉密尔顿(Margaret Heafield Hamilton)在1965年担任 NASA 软件编程部的部长。

软件工程(Software Engineering)这个词就是玛格丽特·汉密尔顿发明的,不过那已经是阿波罗11号飞船期间的事情了。

下面我们要讲的是阿波罗8号飞船的故事。

那个时候她没日没夜地工作,女儿劳伦就在她的实验室玩耍,累了就在地板上睡觉。

这一天,劳伦在指令舱模拟器里按来按去,居然启动了一个叫 P01 的预处理程序。

顿时模拟器就崩溃了。

玛格丽特发现后,就建议加段代码防止此情况出现。

但是大家都觉得航天员不可能这么操作,这个异常处理完全没必要。

主要是因为当年的计算机存储空间和运算能力十分有限,螺蛳壳里做道场,斤斤计较的领导不愿意浪费这个空间。

所以玛格丽特只好加了一个备注:不要在飞行中选择P01模式。

但是,想啥就来啥。

1968年12月26日,人类首次绕月飞行的阿波罗8号飞船上,航天员还是成功地进入了 P01 模式。

这个模式启动的直接结果就是:所有导航数据都会被清空。

航天员再也别想回家了。

玛格丽特带着人奋战了9个小时,终于上传了新的导航数据,一切又回到正常的轨道,阿波罗8号也顺利载着宇航员返航。

这事儿没完,在阿波罗11号飞船即将登陆月球前的几分钟,又一个更大的危机发生了。

欲知详情,请在搜索引擎搜索关键词“程序员永恒的女神”。

0x02 德勤的Goolge+

昀哥以前在《安全基础教育第一季》里说过,当公司做得越来越大的时候,总会出现那么几个安全意识薄弱的人员(俗称猪一样的队友),他们往往会做出一些让人无法理解的事情,比如:他会毫不犹豫地双击运行邮件内的 EXE 附件,或者使用跟用户名一样的密码,或者用户名+当前年份的密码。

而且每家知名公司都有这么几个没心没肺的人,在开源社区泄露源码或敏感信息,在乌云网里随便一划拉就能找到好多:

盛大某开发人员意识不足泄漏内部邮箱帐号密码(github)

迅雷某开发人员意识不足泄漏内部邮箱帐号密码(github)

一次成功的漫游京东内部网络的过程(由一个开发人员失误导致)(github)

新浪开发人员安全意识不足导致部分源码泄漏(googlecode)

腾讯多组内部邮箱账号密码泄漏(github)

……

为什么要刻意强调这一点?

因为 github 支持强大的搜索语法,可以很方便地搜索到一些常规搜索引擎无法搜索到的内容,如搜索内部项目、密码、密钥等。

你可以通过 github 来查找代码安全问题,如输入规则:extension:php mysql_query $_GET,可以搜索到大量包含 mysql_query $_GET 的请求,可以有针对性地进行代码审计。

当你把自己的项目代码上传到 github 时,看看配置文件里是不是有不能说的秘密,思量一下后果。

这不,一位德勤员工据信在2016年Q4或更早将公司代理登录凭证上传至他的 Google+ 上,从而引发了2016年年底到2017年年初的德勤全球电子邮件服务器及其他内部系统被入侵。

有时候你很难理解人们的想法。

在中国,有位官员甚至把微博当成是私密日记本,发布了不少他的私下里的勾当,还配了图……

这位德勤员工可能也以为别人看不到他的 Google+ 信息吧。有图为证:

以及

Google+ 页面上的信息是 public 的,所以有心人已经收集到了德勤内部遍及全球的大量服务器信息,这些信息足以让有心人对德勤发起一次攻击。

这也就是为什么新员工报到之后,我先做一次安全基础教育培训的缘故。

0x03 麻省理工的500英里邮件

这个故事不知道发生于何年何月,发帖人是一位拥有丰富 Unix/Linux/Perl 经验的系统工程师 Trey Harris,据信是上世纪90年代的事情了。

麻省理工的一位统计系主任打电话给 Trey:“我们的邮件系统存在一个问题,我相信我们不能发送超过500英里距离的邮件。”

WTF?!

Email?不能超过500英里?!

“真的,哪怕再远一点点,只能到520英里了,不能再远了。”

Trey 几乎不敢相信自己的耳朵。

这是麻省理工的系主任该说的话吗?

“是什么让你这么认为?”

“实际上已经好几天了。你看,直到刚才,我们才收集到足够多的证据。我让一名地理统计人员去调查了这件事情。”

这回听上去像是一名统计系系主任该说的话了。

“还有。她制作了一张地图,地图上显示我们能发送邮件的区域半径比500英里多那么一点点。即便如此,这个区域内,有些地方也不能发送,或者偶发性地能发送,但是在区域之外从来没有发送成功过。”

是的,作为一名丰富经验的系统工程师,Trey 不假思索地问:“这段时间内系统发生了什么改变吗?”(因为下一句话就一定是请你重启系统吧,XD)

“没错,一位技术支持来过,给系统打过补丁并且重启,之后就发生了这一切。”

Trey 决定自己试一试,今天并不是愚人节。

千真万确,纽约(420英里)就可以发送,但是普罗维登斯(580英里)就失败了。

Trey 证实了这个问题现象跟收件人的位置有关系,与收件人的 ISP 关系不大。

Trey 看了一下 sendmail 的配置文件,毫无意外地,它们正常得不能再正常了。

见鬼了。

于是 Trey 远程登录到 SMTP 端口,握了握手。

对端用一个 SunOS sendmail 标识愉快地做出了响应。

SunOS sendmail 标识?!

突然之间,水落石出。

这个水落石出有点出人意料,下面这段话估计只有系统工程师才能理解:

技术支持工程师打补丁的时候,还连带升级了 SunOS 的版本。

因为在那个年代,Sun 仍然随同操作系统捆绑发布 Sendmail 5 版本,尽管 Sendmail 8 已经相当成熟了。

这样一来,他等于把原来的 sendmail 8 “降级”为 sendmail 5 了。

但升级程序将 sendmail.cf 配置文件单独保留了下来。

注意这可是 sendmail 8 的配置文件喔。

一般来说,较低版本的程序看到不认识的配置项,通常都会选择忽略。

而 sendmail 的二进制安装包对大多数选项没有提供默认值,因此,如果在 sendmail.cf 中找不到相应的设置,它们就会被默认设置为0!

就这样,有那么一个重要的参数:连接远程 SMTP 服务器的超时时间,也被默认设置为零

经过实验证明,在一个具有典型负载的特定机器上,零超时意味着如果连接时间稍微超过3毫秒,服务器就会终止 socket 连接。

在当年,麻省理工的校园网络它是百分之百交换型网络(it was 100%

switched)。

这意味着,它没有那么多的 router,也就没那么多网络延迟。

发送出去的数据包,在遇到 POP 服务器和远端路由器之前,就不会出现路由器延迟。

所以连接一个远端主机的时间,很大程度上就是光所需的时间。

那么,3毫秒,光能跑多远呢

=299792458米/秒×0.003秒×0.001×0.6213712(注:公里折合英里)

=558英里。

XDD……

-EOF-附赠福利:5年前的今天,一个小小的部署错误,让美股最大交易商坠入深渊-

赠图两枚:

语录若干:

互联网公司以后还是别随随便便高调宣布几千万与网红、奇女子、奇男子签约了,前有某酱,今有某闯。也许是有些flag,平凡人消受不起。也许是怀璧其罪吧。

为什么搞力学的擅长经络和针灸呢?我猜想是因为有一个方向叫“生物力学”吧?生物力学是采用力学理论来研究生物体内物质运动的学科,人体力学是其中的一个分支。

“团购”->“共享”->“无人”,人越来越少,人越来越贵,下一步只能是“AI”了…………

-END-

欢迎订阅我的微信订阅号『老兵笔记』

爆炸,解体,入侵,你想得到的你想不到的大BUG们的更多相关文章

  1. 【APT】NodeJS 应用仓库钓鱼,大规模入侵开发人员电脑,批量渗透各大公司内网

    APT][社工]NodeJS 应用仓库钓鱼,大规模入侵开发人员电脑,批量渗透各大公司内网 前言 城堡总是从内部攻破的.再强大的系统,也得通过人来控制.如果将入侵直接从人这个环节发起,那么再坚固的防线, ...

  2. LSTM如何解决梯度消失或爆炸的?

    from:https://zhuanlan.zhihu.com/p/44163528 哪些问题? 梯度消失会导致我们的神经网络中前面层的网络权重无法得到更新,也就停止了学习. 梯度爆炸会使得学习不稳定 ...

  3. 在vscode中配置LeetCode插件,从此愉快地刷题

    大家好,今早在B站看到up主的vscode里藏了leetcode插件,这才知道原来还有这款神器.但是没想到在用的时候遇到了一些麻烦,花了一点时间才解决.所以写这篇文章除了给大家安利这个好用的插件之外, ...

  4. Atitit.病毒木马程序的感染 传播扩散 原理

    Atitit.病毒木马程序的感染 传播扩散 原理 1. 从木马的发展史考虑,木马可以分为四代 1 2. 木马有两大类,远程控制  vs  自我复制传播1 3. 自我复制2 3.1. 需要知道当前cpu ...

  5. 奇妙的 CSS shapes(CSS图形)

    CSS 发展到今天已经越来越强大了.其语法的日新月异,让很多以前完成不了的事情,现在可以非常轻松的做到.今天就向大家介绍几个比较新的强大的 CSS 功能: clip-path shape-outsid ...

  6. N阶台阶问题(详解)

    原创 问题描述: 有N阶台阶,每一步可以走1步台阶或者2步台阶,求出走到第N阶台阶的方法数. 解题思路: 类似于建立树的过程 1 2 1 2   1 2  1        2      1    2 ...

  7. 中国顶级黑客X档案

    sunwear QQ:47347 微博: http://t.qq.com/sunwe4r 博客:http://hi.baidu.com/patricksunwear 好像不用了 日娃哥.EST核心成员 ...

  8. hdu1072(Nightmare)bfs

    Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  9. 奇妙的 CSS shapes(CSS图形) 【css 图形,绘图,CSS 几何图形)】

    http://www.cnblogs.com/coco1s/p/6992177.html <!DOCTYPE html> <html> <head> <met ...

随机推荐

  1. Druid数据库连接池就这么简单

    前言 本章节主要讲解Druid数据库连接池,为什么要学Druid数据库连接池呢?? 我的知识储备数据库连接池有两种->C3P0,DBCP,可是现在看起来并不够用阿~当时学习C3P0的时候,觉得这 ...

  2. PAT-L3-球队“食物链”-dfs-状压-set

    题目分析: 1. 一场双循环赛制的篮球赛,注意双循环,双循环! 2. 共有n只球队,两两之间有胜有负有平局: 3. 输入: 举例: 第一行:W:代表球队1打赢过这只队伍 L:代表球队2没打赢过这只队伍 ...

  3. Divisor counting [线性筛积性函数]

    Divisor counting 题目大意:定义f(n)表示整数n的约数个数.给出正整数n,求f(1)+f(2)+...+f(n)的值. 注释:1<=n<=1000,000 想法:我们再次 ...

  4. Android实用代码七段(二)

    正文 一.获取应用程序下所有Activity public static ArrayList<String> getActivities(Context ctx) {       Arra ...

  5. selenium2自动化测试学习笔记(五)-参数化编程,自动登陆网易QQ邮箱

    学习python下使用selenium2自动测试第6天,参数化编程这节课花了两天时间. 本次编程主要时间是花在熟悉python上 知识点or坑点: 1.读取txt.xml.csv等文件存储的账号.密码 ...

  6. java基础笔记(4)----数组

    介绍: 数组是一种数据类型,是引用类型,是一块连续的内存空间,用于存储和管理相同类型的多个数据. 定义:-- > 数组的声明方式 先声明,在开辟内存空间--> int [] a; a=ne ...

  7. Java基础学习笔记三 Java基础语法

    Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...

  8. C语言最后一次作业——总结报告

    1.当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 首先是因为自己想学跟做动画沾边的专业(动画专业因为某 ...

  9. Markdown文本测试

    一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 1. 这是一 2. 这是二 这是无序符号 My Github 这是着重表示 这是斜体 一级粗体 二级斜体 cin >> a; c ...

  10. JFinal项目发送邮件——jfinal-mail-plugin

    JFianl框架: JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有 ...