delphij's Chaos
选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
Google Authenticator 是一个 TOTP(基于时间的一次性口令)实现,它采用了 RFC 4226 算法。
Google Authenticator 与 RSA SecurID 非常类似。具体来说,它使用一个随机串和以整数表达的时间作为输入去计算 HOTP(算法是 HMAC-SHA-1),然后取输出的最后几位作为一次性口令。
虽然目前已经发现了一些 SHA-1 的弱点,但目前为止还没有公开的已知算法可以从 hash 值直接高效地反推出明文信息。另一方面, HOTP 只截取 hash 的最后几位,因此,攻击者在知道可能的明文信息之后,还必须获得足够多的 TOTP 时间和 hash 值才能够进行离线验证。
在现代 Unix 系统上,通常使用 PAM 来完成系统的验证工作。在 FreeBSD 上,可以通过 security/pam_google_authenticator 来安装 Google Authenticator 的 PAM 模块。这样就可以配置 sudo 来使用它做验证了。
在 /usr/local/etc/pam.d/sudo 中,auth部分预设是这样的:
auth include system
这表示采用系统内建的 ‘system’ 规则配置。我们在这后面加入强制使用 Google Authenticator 的配置:
auth required /usr/local/lib/pam_google_authenticator.so noskewadj
这里的 required 表示如果验证失败则认为整个验证链失败。
如果不需要用户重新输入口令,则可以用上面这行换掉include那行。
在 sudoers 中还需要配置使用口令。如果是 NOPASSWD,则系统会绕过 auth 这一部分。
需要注意的是,由于 sudo 是一个特权提升点,因此假如用可以被用户自行改动的文件作为访问控制机制,便会构成一个显然的安全漏洞。因此,对应的 Google Authenticator 配置应以 sudo 的目标用户的身份进行(此外还应在sudoers中配置 Defaults rootpw):
Read more...Steven Paul “Steve” Jobs (1955 - 2011) passed away peacefully today. There aren’t enough words to express all he contributed to this world.
Today, a shocking news have shaken the industry. Steve Jobs, a pioneer of our industry, after several years of struggling with cancer, passed away at 56. This marks a loss not only to Apple computer, but the whole industry, even Apple’s business rivals.
I want to quote his 2005 Commencement at Stanford:
Read more...鸡蛋不能放在同一个篮子里,特别是 DNS 服务器这样的鸡蛋……在没拿到AS之前,至少也应该做到跨ISP冗余才好。
Read more...Von Neumann体系结构的计算机系统的一项特点是使用内存来保存程序和数据。这种设计减少了制造计算机的成本,但是也带来了一个弱点:因为事实上程序也是一种数据,如果这些"数据"在运行时可写,程序便有可能修改其本身,而如果这一特性被误用,例如由于程序本身的设计缺陷,攻击者便可以利用它来执行攻击者希望的任何事情。
直观上,解决这个问题的方法是让应用程序可写的位置都不可执行,或者说,应用程序新写的数据,在获得更高权限实体核准之前(例如,这些实体可以验证这些数据是生成自可信来源的输入),不允许作为程序执行。
实践上,需要考虑的问题则比乍看起来要复杂的多。例如,在比较新的处理器上,在虚拟内存子系统可以实现在映射内存页时让 w 和 x 互斥(即可写的内存页就不可执行),来让攻击者利用缓冲区溢出问题,覆盖返回地址令进程跳转到其指定的地址时触发保护异常,但这种做法并不能阻止因为程序本身的设计缺陷导致这些数据被写盘,然后再被解释或执行的问题。举例来说,如果攻击者掌握两项安全弱点,一项是可以执行文件系统中任意位置的php脚本但不能指定任何参数,另一项是可以在临时目录中写一个扩展名为.jpg的文件,那么利用这两项漏洞就可以实现以Web应用的身份执行任意代码的目的了。对于某些每个月都会出现一个本地特权提升问题的操作系统而言,这很可能会带来更加灾难性的后果。通过umask的设置,以及对脚本路径进行限制,可以解决绝大多数情况下的这类问题,但并不总能解决问题—-对所有输入进行验证和检查,并尽可能限制 Web 应用,或其它与用户输入交互的组件的执行权限,仍然是非常必要的。
Read more...在与癌症斗争了 7 年之后,Steve Jobs 今天正式向 Apple 董事会辞去了 CEO 职务。
让我们用 Apple 1997 年的广告 Think Different 来怀念这位科技界的领袖和属于他的时代:
Here’s to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do. - Apple Inc.
Read more...今天 BAFUG 活动, Luigi Rizzo (十年前提出DEVICE_POLLING概念的那哥们) 带来了他在 FreeBSD 上新实作的 netmap。
简单来说 netmap 实际上是提供了一种让用户程序以一致的接口直接访问网卡(收发包且zero copy)的方法。Luigi Rizzo 的测试中,用以 1050MHz 的单核,在很普通的万兆网卡上就可以轻松达到 14.8 Mpps 了,每个包的开销大约是90个时钟周期。
netmap 对网卡的驱动需要做少量修改,但基本都在30行以内。系统仍然可以"看到"用于netmap的网卡,这个接口暂时还不支持 kqueue(不过貌似暂时也没太大必要的说,毕竟一台机器不会有几千块网卡)。除了性能之外,netmap的设计还可以确保内核永远不崩,此外,现有的 libpcap 程序可以很容易地移植到 netmap 平台(取了一个路由平台做例子,使用 libpcap 兼容库可达到大约 70% 左右的 native API 性能;直接用 native API 的话,性能大约是经过优化的普通 libpcap+内核模块 的 Linux 环境的 4 倍)。
现在我自己想到的比较有用的用途是在用户态跑一个 TCP/IP 栈一类的应用—-当然,应用程序可以跟这个 TCP 栈捆在一起。到会的 C记,J记 以及某测试公司的同学提出了不少问题,其中关于 netmap 需要复制哪些内存,这个东西对他们的业务来来说,用途会更直接一些。
这个暂时还没进 -CURRENT。立刻可以想到的改进包括尽量省掉对页表的改动。应用方面似乎可以给 nginx 啥的直接做个 TCP 栈之类的?省掉了 socket 需要的开销,TCP方面可以做的事情就很多了,比如两台机器可以互相推 TCP 状态之类的来做 HA,等等。
Read more...之前一直没什么概念,今天看了微软的 KB 321169 的解释,大致如此:
不过感觉这个解释依然不是很有说服力—-文档上说,SMB服务器端是需要对 NT_TRANSACT_NOTIFY_CHANGE 给出回应的,那么这种情况下ACK不就回应回来了吗?或者说,只要收到了 ACK 就说明服务器端已经处理了这条 SMB?哪位帮忙理解一下?
Read more...Ruby 从下一个版本,也就是 1.9.3 开始,从原先的 GPLv2 许可证换成了 2-clause BSD 许可证(大体上相当于 MIT 许可证)。
早期 Ruby 采用的是自由软件基金会推荐的 GPLv2 or later 许可证方式。在实际操作中这种许可方式十分常见,这种许可证方式包含两层意思:
这其中 (*) 的部分实际上是开给自由软件基金会的一张空白支票,并且可能导致各式各样的法律问题。据我个人的了解,湾区企业的法务部门通常不允许公司以这种方式发布软件,因而,商业公司在使用 GPLv2 or later 许可证的软件时,通常会在发布代码的同时明确说明自己在使用这个软件时只遵循某个特定版本的GPL,以规避潜在的法律风险:
/*
* [company] elects to have and use the contents of [filename] under and governed
* by the GNU General Public License (GPL) Version 2, only. However, the following
* notice accompanied the original version of this file:
*/
然而,实际上这样使用代码也是有风险的。例如,如此这家厂商便无法同时使用 GPLv3 许可证的代码。因为GPLv2 中规定:
Read more...最近改一个用到 OpenSSL 的程序,顺手用 valgrind 抓了一下,发现很多"Conditional jump or move depends on uninitialised value(s)“的错误。发现 OpenSSL 的 FAQ 提到,在生成随机数时会将输入缓冲区(未初始化)的内容直接混入 entropy pool,使用 valgrind 时便会导致警告。
如果这种警告对调试产生困扰,则可以定义 PURIFY 来消除(从代码来看,PURIFY一共影响三处代码:crypto/rand/md_rand.c中,定义PURIFY会去掉将未初始化缓冲区作为输入参数追加到摘要中的过程;crypto/rand/randfile.c中一处在定义了 PURIFY 时会对 stat(2) 结构先进行清零初始化【这个对 FreeBSD 不是问题,FreeBSD的 stat(2) 覆盖整个返回缓冲区】,另一处则是不用缓冲区中未初始化的部分参与摘要追加。
理论上,定义了PURIFY会降低随机数生成过程的随机性,但会消除事先通过特定输入来影响某些内存内容导致对随机数发生结果的影响;不过因为有其他输入,因此这种影响导致的结果应该并不严重。不过,原则上安全程序应该尽量使用更多的 entropy 输入,而不是依赖这种不确定性吧?
Read more...今天同事跑来问我为什么没办法checkout一个子目录,发现svn提示说某个目录已有既有的、未有版本的副本(这是一个新的checkout)。
删除重新checkout,问题依旧。
检查之前的commit log,发现另外有人 svn rm 掉了 .svn 目录(看起来那个目录的内容是从其它地方复制过来)。
因为没有 svn 库本身的操作权限,也没有联系到事主(正规的做法是想办法干掉这个revision),所以尝试了下面的方法:
这样一来就可以checkout和正常操作了。不过,为什么 svn 会允许导入或删除 .svn 目录呢?哪位大牛帮忙解释一下?
Read more...