一段时间总结——琐碎、开源软件安全、代码即数据、Lisp 及我的键盘

为了方便整理写的文章和我的笔记,在工作之余我用 Common Lisp 重新写了博客系统,并改成 Wiki 形式,运行在 Hunchentoot 之上。如你所见,就是这个。

之后花费了两周的时间才把文章和笔记整理好。整理笔记是个非常耗时的工作,要把零碎的整合在一起,纠正错误,有很多淡忘的内容还要重新回顾,这段时间里我几乎晚上没有在 1 点之前睡过。

有意思的是,在这期间 Bash 爆出了漏洞,第一时间加入到了响应阵列中。做漏洞响应是非常累的一件事,但也非常有趣,这种经历是很宝贵的。开源软件爆发高危漏洞有个非常有意思的现象:一旦点燃苗头,漏洞就迅速扩散开来,全世界的安全研究人员、黑客和程序员就表现地异常积极,研究漏洞原理、修复补丁、应急响应、写攻击代码、开发批量攻击程序等等,而这又引发了代码中的漏洞迅速被修复,这种短时间爆发持续不了多久又迅速开始灭亡,这周期是很短暂的,所以相比商业闭源软件来说要安全地多,因为商业软件很多时候出现漏洞之后,它的存活期是非常长的。甚至在爆发之前很可能已经在地下流传一段时间了,并且通常修复工作只有厂商自己来完成, 漫长的周期带来的安全影响非常大。

这次的 Bash 漏洞又是一次没严格区分代码和数据的造成的问题。“代码即数据”出现了两个极端现象:

第一个极端就是安全问题,这从计算机体系结构一直到编译器、解析器都存在这个问题,CPU 的指令执行依赖的是寄存器和内存的二进制数据,一旦可以让外部控制寄存器,就会引起安全问题,这里的“外部”用抽象来描述就是“输入”,著名的缓存溢出的根本原因就在这里。除此之外,诸如 XSS 和 SQL 注入,也是因为没区分代码和数据,从编译器和解析器的角度来说,它接受的是输入的“代码”,代码通常是文本形式表示的,解析器和编译器再解析文本内容并执行,所以 XSS 的诱发原因就是我们可以构造文本形式的代码来随意控制 JS、HTML 和 CSS 等等解析器,注入也是同样的原因。

第二个极端就是让 Lisp 语言拥有了几乎无敌的能力,我们看到的 Lisp 语法就是一堆括号包围着的代码,而这堆括号即是代码,也是数据,当它是代码的时候,就按照相应的指示操作。而当它是数据的时候,就意味着我们可以操作数据,操作数据就更意味着我们可以让 Lisp 写 Lisp 代码——就是自己写自己,然后再让 Lisp 解析器把生成的数据当作代码执行,这就是 Lisp 的宏。Lisp 这种不区分代码和数据的形式叫作“同像性”。你会问那这样 Lisp 岂不是更不安全咯?事实上 Lisp 的宏通常是在编译阶段或者读取阶段完成的,所以安全问题基本上可以忽略;而 Lisp 又有“运行期”,即在运行期间调用 eval 函数,这时就是非常危险的了。

作为一名 Linuxer 和 Emacser,终于在对 HHKB 心痒很久很久的情况下,压缩了尚未找到工作的女朋友的零花钱、降低了平时生活标准以及降低了新的衣服裤子档次数倍(已经是山寨级别了)情况下,总共花了 1700 RMB拿下。另还买了一把古老的 IBM M4-1键盘。这种做法最终还是让她接受了,理由有两个:1、买都买了,反正本月不能超支了;2、作为一名技术员,为自己每天用来糊口的工具投资没什么错吧?

晒晒我的 3 把键盘:HHKB、ThinkPad 键盘和 IBM 键盘:

keyboard1.png

keyboard2.png

另外,咱家的猫在哥精心照顾下已经成长了不少,下图右边是带它回家那天照的。作为一只拥有黑白两色的二进制猫,在精心调教下,已经会用回车键了:

cat.jpg

作为从小养猫户,另一只我 7 年前就一直养在家里的黑白(依然是二进制血统啊!)猫儿已经老得掉牙了:

cat1.png

嗯,从小到大一直在做的两件事就是养猫和写代码。