今天寻找一个写好的MD5加密类想做个文件校验工具,在Google里搜索“MD5”看到的第一个搜索结果让我震惊:

[singlepic=18209]

这是一个提供在线MD5破解的网站!
虽然当年的山东大学副教授王小云冲上国际密码大会的讲坛公布了对对MD5、HAVAL-128、MD4和RIPEMD的破解成果后,MD5已经被认为是不安全的。不过据王小云原始算法,破解MD5至少也要比较好的计算机计算几个小时能够找出一个碰撞而已。注意,碰撞,而不是破解。用碰撞密码可以一样实现登陆,但是知道破解,就意味着拿到密码明文。相比所有人的密码多少都有那么一点点意义在里面,被人知道你使用的密码的含义和规律是多么可怕的一件事情!
这个网站,提供在线MD5破解的查询,简单说,就是已知一些密码的MD5,然后把密码和MD5一起存起来,供人查询。当人们提交的MD5足够多,或者达到覆盖大部分有含义字符串后,就达到了比较好的破解效果。

本站4T硬盘已经上线,共有MD5记录457,354,352,282条,宇宙第一,且还在不断增长中,已包含12位及12位以下数字、8位字母、全部7 位及以下字母加数字等组合,并针对国内用户做了大量优化,例如已经包含所有手机号码、全国部分大中城市固定电话号码、百家姓、常用拼音等大量组合,另加入了大型网站真实会员密码数据100万条。本站数据量大,查询速度快,同时支持16位及32位密码查询。通过对10万会员的真实动网论坛样本数据的测试,本站对于动网论坛密码的命中率达到83%。全国独此一家。另感谢一热心网友给本站奉上数百万条数据库原始密码样本,大大提高了命中率!

我来说说为什么震惊。

隐患及应用情景

网络管理员要求第一要政治过硬,他能看到很多东西,设计为人类不该看到的,但是他要禁得住这份诱惑,坐怀不乱…
但是不是每个网络管理员都是这样的人。首先我们可以相信,大型商业网站的网络管理员,在公司制度的限制下,是政治合格的。
但是在我们的生活中还是大量地用到了MD5,比如国内大部分论坛至少是Discuz和动网,这两家都采用MD5加密。论坛是如此之多,甚至不可能没有人不使用基于MD5的论坛等。一旦你的论坛注册信息出现在一个政治不可靠的网络管理员面前,问题就出现了。如果你的密码比较弱,他是可以通过在线破解查询到明文的。注意,是明文。因为找到碰撞并不是什么大事,他本身已经是网络管理员,不需要明文也能把你密码改掉,看到你在这个站的信息。
比如说,我看到123456的MD5是e10adc3949ba59abbe56e057f20f883e,于是我忍不住拿e10adc3949ba59abbe56e057f20f883e在同济网数据库里用户表里搜了一下,发现有5293个用户的密码是123456…P.S. 同济网总计233959个用户,2.2%的经典懒人。
问题是你还可能留下一个真实邮箱,或者没留下真实邮箱,但是用了“主号”当作用户名注册,这样很容易Google到你的邮箱。
虽然邮箱服务可能使用非MD5加密的形式,这样拿MD5的碰撞去登陆自然失败,问题是他拿到的是明文,这样任何加密都会失败。
一旦邮箱被攻破…基本上你在互联网的身份就已经被盗用了(告诉我你邮箱里没东西,我只能说你是土人了)。
这自然是一个严重的安全隐患吧!

个人密码的Best Practices

一个人至少有两组密码。银行卡6位数字密码那是没办法,网络上使用的密码肯定是另外一组。懒人是如此之多,以至于同一个密码到处用的人太多太多。最好的密码策略是使用分级密码,一个人应当设计至少五组密码。按照密码等级介绍如下:

  • 公用银行卡密码:对的,公用,比如这张卡你和家人一起用,这是最简单的,有意义的6位数字密码。建议用电话号码变换一下(如第二位到第七位,或第三位到第五位重复两遍),这样大家都清楚,密级也不算太低。
  • 私有银行卡密码:私房钱之类的,只有自己知道的密码。因为是6位数字,密级高不了。
  • 公共论坛注册密码:要有一定复杂度的,注册的时候尽量不用真实邮箱,必须要验证的时候用一个非主要邮箱。
  • 工作计算机密码:为什么工作计算机要单独设置密码呢?因为总有的时候,当你不在计算机旁边时,有急事发生,这时候你必须授权另外一个人打开你的计算机获取一些资料,这时候就要口述密码。建议这个密码等级不能太低(Windows域要求字母数字和符号),但是也容易记忆,而且便于口述,且与等级最高的密码生成规律不同。这样授权结束后,你可以继续按照这个密码的生成规律再生成一个新的密码即可。
  • 支付宝密码:这个密码需要一定复杂度,因为直接和钱相关。在极少的情况,这个密码也要授权给别人的。可以按照工作计算机密码等级去设置。
  • 信息中心密码:最高级的密码,这个密码管理你的个人信息中心,如QQ、主Email和个人计算机。这个密码的泄露,基本就完蛋了,别人可以伪装成你,这个问题就大了…

论坛和Email还在使用同样密码的孩子们,快改密码吧。

今天释出的KB958644号紧急更新,引起了我不小的兴趣,很希望知道到底是什么东西导致微软捅了这么大的篓子呢?无奈,因为出品公司(微软)承认这是一个严重的安全漏洞,提出问题的网站(http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-4250)已经去除了关于此漏洞的详细说明。这条路不通了。
MS08-067(http://support.microsoft.com/?kbid=958644)描述了什么样的系统里具体什么样的文件会出问题。从中可以看到,主要问题出在Netapi32.dll这个DLL。可以看出,自Microsoft Windows 2000 Service Pack 4(不是说之前的就没有,而是只从SP4开始技术支持)开始的5.0.2195.7203版本的Netapi32.dll,直到Windows Vista、Windows Server 2008甚至Windows 7 Pre-Beta的6.1.6801.4106版本Netapi32.dll都逃脱不了噩运。
重要的提示来自Microsoft Security Bulletin MS08-067 – Critical(Vulnerability in Server Service Could Allow Remote Code Execution (958644))一文。文中特别指出,这个漏洞如此广泛,甚至Windows Server 2008的Server Core installation也会受到同样安全威胁等级的威胁。这说明,这个漏洞存在很基础的地方。
Server Core installation是Server功能的极小集,根据Compare Server Core Installation Options一文,Server Core installation可以安装以下功能:

  • Active Directory Domain Services
  • Active Directory Lightweight Directory Services
  • DHCP Server
  • DNS Server
  • File Services
  • Hyper-V
  • Print Services
  • Web Services (IIS) without ASP.NET

鉴于Windows 2000也是受害者,因此不可能是Active Directory Lightweight Directory Services和Hyper-V的问题。
Server Core Functions by DLL一文给出了netapi32.dll的详细功能说明。
我不辞辛苦地把提到的API函数进行Google,存在漏洞的API肯定是存在在Windows 2000以来所有版本Windows中的,例如DsGetDcCloseW这样的API,微软文档声称“Client:Requires Windows Vista or Windows XP,Server:Requires Windows Server 2008 or Windows Server 2003.”,因此不可能是与漏洞有关。
剩下的可疑的Windows API有这些:

  • netapi32.dll DsAddressToSiteNamesA
  • netapi32.dll DsAddressToSiteNamesExA
  • netapi32.dll DsAddressToSiteNamesExW
  • netapi32.dll DsAddressToSiteNamesW
  • netapi32.dll DsDeregisterDnsHostRecordsA
  • netapi32.dll DsDeregisterDnsHostRecordsW
  • netapi32.dll DsEnumerateDomainTrustsA
  • netapi32.dll DsEnumerateDomainTrustsW
  • netapi32.dll DsGetDcNameA
  • netapi32.dll DsGetDcNameW
  • netapi32.dll DsGetDcOpenA
  • netapi32.dll DsGetDcOpenW
  • netapi32.dll DsGetDcSiteCoverageA
  • netapi32.dll DsGetDcSiteCoverageW
  • netapi32.dll DsGetSiteNameA
  • netapi32.dll DsGetSiteNameW
  • netapi32.dll DsMergeForestTrustInformationW
  • netapi32.dll DsRoleFreeMemory
  • netapi32.dll DsRoleGetPrimaryDomainInformation
  • netapi32.dll NetApiBufferAllocate
  • netapi32.dll NetApiBufferFree
  • netapi32.dll NetApiBufferReallocate
  • netapi32.dll NetApiBufferSize
  • netapi32.dll NetConnectionEnum
  • netapi32.dll NetDfsAdd
  • netapi32.dll NetDfsAddFtRoot
  • netapi32.dll NetDfsAddStdRoot
  • netapi32.dll NetDfsAddStdRootForced
  • netapi32.dll NetDfsEnum
  • netapi32.dll NetDfsGetClientInfo
  • netapi32.dll NetDfsGetInfo
  • netapi32.dll NetDfsRemove
  • netapi32.dll NetDfsRemoveFtRoot
  • netapi32.dll NetDfsRemoveStdRoot
  • netapi32.dll NetDfsSetClientInfo
  • netapi32.dll NetDfsSetInfo
  • netapi32.dll NetFileClose
  • netapi32.dll NetFileEnum
  • netapi32.dll NetFileGetInfo
  • netapi32.dll NetGetAnyDCName
  • netapi32.dll NetGetDCName
  • netapi32.dll NetGetDisplayInformationIndex
  • netapi32.dll NetGetJoinableOUs
  • netapi32.dll NetGetJoinInformation
  • netapi32.dll NetGroupAdd
  • netapi32.dll NetGroupAddUser
  • netapi32.dll NetGroupDel
  • netapi32.dll NetGroupDelUser
  • netapi32.dll NetGroupEnum
  • netapi32.dll NetGroupGetInfo
  • netapi32.dll NetGroupGetUsers
  • netapi32.dll NetGroupSetInfo
  • netapi32.dll NetGroupSetUsers
  • netapi32.dll NetLocalGroupAdd
  • netapi32.dll NetLocalGroupAddMembers
  • netapi32.dll NetLocalGroupDel
  • netapi32.dll NetLocalGroupDelMembers
  • netapi32.dll NetLocalGroupEnum
  • netapi32.dll NetLocalGroupGetInfo
  • netapi32.dll NetLocalGroupGetMembers
  • netapi32.dll NetLocalGroupSetInfo
  • netapi32.dll NetLocalGroupSetMembers
  • netapi32.dll NetQueryDisplayInformation
  • netapi32.dll NetRemoteComputerSupports
  • netapi32.dll NetRemoteTOD
  • netapi32.dll NetRenameMachineInDomain
  • netapi32.dll NetScheduleJobAdd
  • netapi32.dll NetScheduleJobDel
  • netapi32.dll NetScheduleJobEnum
  • netapi32.dll NetScheduleJobGetInfo
  • netapi32.dll NetServerComputerNameAdd
  • netapi32.dll NetServerComputerNameDel
  • netapi32.dll NetServerDiskEnum
  • netapi32.dll NetServerEnum
  • netapi32.dll NetServerGetInfo
  • netapi32.dll NetServerSetInfo
  • netapi32.dll NetServerTransportAdd
  • netapi32.dll NetServerTransportAddEx
  • netapi32.dll NetServerTransportDel
  • netapi32.dll NetServerTransportEnum
  • netapi32.dll NetSessionDel
  • netapi32.dll NetSessionEnum
  • netapi32.dll NetSessionGetInfo
  • netapi32.dll NetShareAdd
  • netapi32.dll NetShareCheck
  • netapi32.dll NetShareDel
  • netapi32.dll NetShareEnum
  • netapi32.dll NetShareGetInfo
  • netapi32.dll NetShareSetInfo
  • netapi32.dll NetStatisticsGet
  • netapi32.dll NetUnjoinDomain
  • netapi32.dll NetUseAdd
  • netapi32.dll NetUseDel
  • netapi32.dll NetUseEnum
  • netapi32.dll NetUseGetInfo
  • netapi32.dll NetUserAdd
  • netapi32.dll NetUserChangePassword
  • netapi32.dll NetUserDel
  • netapi32.dll NetUserEnum
  • netapi32.dll NetUserGetGroups
  • netapi32.dll NetUserGetInfo
  • netapi32.dll NetUserGetLocalGroups
  • netapi32.dll NetUserModalsGet
  • netapi32.dll NetUserModalsSet
  • netapi32.dll NetUserSetGroups
  • netapi32.dll NetUserSetInfo
  • netapi32.dll NetValidatePasswordPolicy
  • netapi32.dll NetWkstaGetInfo
  • netapi32.dll NetWkstaSetInfo
  • netapi32.dll NetWkstaTransportAdd
  • netapi32.dll NetWkstaTransportDel
  • netapi32.dll NetWkstaTransportEnum
  • netapi32.dll NetWkstaUserEnum
  • netapi32.dll NetWkstaUserGetInfo
  • netapi32.dll NetWkstaUserSetInfo

接下来只能猜了…
基于以上各点线索,猜测KB958644特大漏洞的原理可能是以下:

  • 文件共享及发现(共享打印机等)
  • Active Directory目录服务

如果你是我博客的读者,那你老老实实看完学点知识,如果你是从搜索引擎过来的,那我估计你是不喜欢Windows需要按下CTRL+ALT+DELETE才能登陆吧,为了节省你的时间,你要的在这里:
控制面板,用户帐户,高级里面,安全登陆,去掉勾就可以不使用安全登陆了。

Windows Server 2003和Windows Server 2008默认情况下,加入域的Windows XP默认情况下都需要按下CTRL+ALT+DELETE才能看见登录框,意义在哪里呢?
设想这样一个场景,我写了一个全屏幕的应用,界面就像Windows XP的登陆界面,连用户名也一样,你看到之后是不是忍不住会用Windows密码去登陆呢?应该会吧,这样你的Windows帐户密码就泄露了。你也许觉得Windows密码没什么,不过对于Server来说,尤其是如果你是域管理员,那可就是个大大大大的安全问题了,因为用这个密码可以登陆域上任何机器啊…
因此,设置按下CTRL+ALT+DELETE才能登陆,会提高安全性,因为在Windows下,按下按下CTRL+ALT+DELETE,如果在应用程序下,至少会弹出任务管理器,而在真实的Windows登陆窗,这样的操作会出现登陆界面。
从而,保证出现的登陆窗口是真实的,而不是某种模拟程序。

[singlepic=15448]

之前我们曾经报道DNS协议本身发现了一个严重安全问题VU# 800113,攻击者有可能利用该漏洞进行高效”Cache投毒”让DNS缓存服务器相信自己伪造的来自权威DNS的回应是真实的,达到劫持网站流量来牟利或者将用户引导到一些伪造的钓鱼站点来骗取敏感数据。
尽管最早发现这个问题的安全研究员丹·卡明斯基(Dan Kaminsky)认为该漏洞不会因为对补丁的逆向工程而泄露,不过先后有多位研究人员并将详细的分析结果公布在了互联网上。
日前,可以直接进行攻击的代码终于出现了,据称著名黑客HD Moore已经率先公布了可用代码。利用这段代码可以对DNS服务器进行投毒,将一条恶意纪录植入目标服务器,该服务器将随机发起域名查询,此时攻击者可以提供伪造的响应,将域名服务器中的纪录指向其特定站点。

不得不佩服Unix和BSD的设计者,他们为整个行业建立了基本的概念,当互联网的根基DNS的协议模型出现问题的时候,整个虚拟世界都要震颤。
在我管理的软件项目中,用于安全的系统设计考量和代码量都会占到了相当的比重,大概30%的样子。都是血的代价换来的经验,抽象到底都是一个逻辑问题,很多模型都是现成的,你要做这样一个东西,就要考虑这些方面,这样的工作其实是高度重复的,我没仔细研究过,不过凭我的直觉我觉得这些状态都可以通过数学模型来论证。
设计良好的系统使用数学方法应该可以验证其逻辑,在逻辑上不会有被攻破的漏洞,其他的,应该就是缓存区溢出检测(这应该是虚拟机保证的事情),和SQL注入(这应该由DBMS保证)吧。