计算机系统中,用户在一般情况并不直接与内核打交道,中间还有一层应用层作为接口在用户与内核之间相互作用着,但这种设计能够保护内核不会被用户肆意修改窥测,但也随之带来了安全问题,由于应用层并不是能完全信任之的,因此在操作系统安全功能中,往往会提供可信路径这一功能[这也是橘皮书 B2 级的安全要求]。
可信路径[trusted path]是怎么样的概念?顾名思义,它就是这么一种功能的实现:避过应用层,在用户与内核之间开辟一条直接的可信任的交互通道。真的有必要那么麻烦,不得不在进行高风险操作时使用可信路径与内核互动吗?遗憾地告诉你:确实是!有经验的系统管理员普遍都很清楚来自网络的威胁有多么严重。黑帽子们能使用特洛伊木马[Trojan horse],记录你在登陆及其它敏感操作时的行动,从而窃取你的宝贵口令。
你一定对"ctrl + alt + del"三键序列极有印象,在DOS年代,我们用它快速重启机器,并称之为"热启动",而在WINDOWS 9X时代,我们则用它查看进程,不过也许你没有注意到,在WINDOWS9X 向WINNT过渡后,我们的PC也运行着NT内核的WIN2000/XP时,事实上"ctrl + alt + del"三键的职能已经有了些微改变,微软在它的官方文档中,称"ctrl + alt + del"为SAS[Secure Attention Sequence],并且将之列为安全功能-可信路径的构成部分,而在linux下,也有着类似的按键序列可用。
Linux 环境下的安全留意键―― SAK[Secure Attention Key],这个SAK是一组键, 在我们常见的X86平台下,它是"alt+sysrq+k",而在SPARC下,SAK则是"alt+STOP+k", SAK默认不打开,需要用 echo "1"
/proc/sys/kernel/sysrq 这条命令激活,当然,你也可以将它写进登录脚本中,这样就不必每次麻烦了。对SAK实现有兴趣的朋友,可以参考参考 linux/drivers/char/sysrq.c和 linux/drivers/char/tty_io.c::do_SAK
SAK序列键其实是被称做"magic sysrq key" 中的一组,"magic sysrq key" 还有一些特殊键,与SAK一样,它们都是使用"alt + sysrq + ..."格式,其中的...可换为某些特殊的字母比如"i",在《MAGIC SYSRQ KEY DOCUMENTATION v1.32》手册上,"alt + sysrq +i" 所代表的行为是"Send a SIGKILL to all processes, except for init." 意思就是向除了 init 外的所有进程发送一条kill 信号;现在我们看看在《MAGIC SYSRQ KEY DOCUMENTATION v1.32》手册中对"alt + sysrq +k"的解释吧:
"sa'K' (Secure Access Key) is usefull when you want to be
sure there are no trojan program is running at console and
which could grab your password when you would try to login.
It will kill all programs on given console and thus
letting you make sure that the login prompt you see is
actually the one from init, not some trojan program. "
这段话正是SAK的功能写照:SAK对你确定在登陆时没有试图窃取密码的特洛伊木马程序运行在当前控制台上,它能杀死当前控制台上的全部应用程序,以此令你确信看到的登陆画面来自init,而非木马程序。当你按下这组键时,也就是引发了这一特定事件,那么按照设计的流程,系统陷入核心状态,这时你将可以直接与内核沟通,也就是说,出现在你的“理应”是如假包换的真实登陆提示信息,为什么是理应?我们下文分析:-
在讨论SAK的脆弱点之前,我们先来看看当你按下SAK时,系统发生了什么事情吧,当系统处在正常状态下时,用户按下键盘时,此事件将进入核心以解释,若其扫描码对应为SAK,则内核将找出引发此SAK的终端,之后为了创建可信路径,则需要杀死所有非核心进程,也就是说在此时,任何此终端上用户建立的进程都将死亡,当然,可能存在的木马进程也被杀死了,系统最后将重新打开登陆进程,使用户获得放心的交互。
注意:
1:事实上这里提到的与内核交互,确切地说应该是与TCB[Trusted Computing Base,可信计算基]的软件部分打交道,包括安全内核与可信系统程序,TCB事实上是个很广泛的概念,包括了安全内核、特权程序、系统命令与相关硬件设备,甚至在逻辑上包括了系统管理员和安全管理员,离题太远,请各位对TCB感兴趣的朋友查询相关手册`:-
2:Q:SAK怎样判断该杀死哪些进程,以免少杀及误杀?
A:这可真是一个好问题,因为编制登陆模拟器木马的的黑客必须深刻理解SAK杀死应用进程的实现方式,已此试图破坏这机制,事实上,SAK命令杀死应用进程是根据进程的PID来执行的,linux系统刚刚启动时是运行在核心状态的,这时只有一个初始化进程,初始化完毕时,初始化进程将启动一个init进程,自己进入 idle循环,init的PID=1,它是一个真正的进程,也将是进程树上的根,之后的所有进程都是init进程的“子子孙孙”,可以使用pstree命令查看系统中当前的进程树图,以此了解进程间的关系。
刚刚我们已经了解了linux操作系统下的可信路径的相关知识,但是我想已经有不少朋友更想了解在WINDOWS NT/2000/XP下的可信路径的情况,Now,let's go.
在NT系列windows操作系统中的可信路径的引发方法是把 ctrl+alt+del这三个键同时按下,这称为标准SAS[Secure Attention Sequence],当系统检测到一个标准SAS序列的扫描码时,将由winlogon 进程将系统设置为已注销、已登陆、已锁定三种不同状态,然后切换当前桌面到 Winlogon 桌面。不过要注意到,WINDOWS中的可信路径的实现似乎与linux下大不一样。比如在WIN2000下,按下ctrl+alt+del,切换到winlogon桌面,但是当前用户的进程并没有在这个时候被杀死,比如你可以听着mp3按ctrl+alt+del,这样做你将在winlogon桌面下,照样听mp3,如果其意义是需要注销再登陆,那自然的,注销的时候,当前用户的进程都会被杀死,不过那样的操作从开始菜单中的关机命令有什么区别,并且,我们也可以在winlogon桌面上边改密码边听着mp3,不会有木马在后台偷偷地记录吗?对,用户进程并不是像在 linux 下那样被简单地杀死,事实上,在winlogon 桌面初始化过程中,创建了三个桌面:应用程序桌面(\Windows\WinSta0\default)、Winlogon桌面(\Windows\WinSta0\Winlogon)和屏幕保护桌面(\Windows\WinSta0\ScrenSaver)。而在安全策略上,只有winlogon进程可以访问到winlogon桌面,其它两个桌面才允许用户及其所属进程访问,因此虽然用户进程在SAS激发后并不会被杀死,但它们也不能访问winlogon桌面以偷窃用户口令,这就是“Windows特色的可信路径实现道路” :-
等等,你也许会想到GINA木马,它不就是伪造的登陆窗口吗?在登陆到windowsNT时,我们按下ctrl+alt+del这个所谓的可信路径时,怎么没有将它杀掉?事实上,GINA木马并不是直接击败可信路径这一功能,而是破坏了可信路径下层的TCB,改变了TCB中软件结构的一部分!现在我们来回忆一下GINA木马的一些细节,还记得吧?
GINA[GINA: Graphical Identification and Authentication,图形身份验证 ] 在windows中,缺省的GINA就是msgina.dll ,它是运行在winlogon.exe的进程空间中的,由注册表中\HKEY_LOCAL_MACHINE\Softwar
e\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL=yourgina.dll 定义,默认情况下则就是msgina.dll,而GINA木马的实现机理则就是通过修改注册表,将原来的msgina.dll替换为自己的木马GINA,以此实现将截获的用户名和密码保存在某个文件中,供黑帽子读取。严格来说这确实不算是直接击败了SAS可信路径功能,因为必须有administrator权限才能进行操作注册表,完成替换系统文件的工作,而这种方式是微软提供给客户的一种功能,方便客户以自己的方式来进行用户身份验证,比如使用指纹鉴别仪,视网膜扫校仪等非口令验证方式,只要替换msgina.dll为特定的GINA,就可以完成这种衔接工作,因此这只是一种功能,不是缺陷,更不能算是漏洞;并且,在WINDOWS这种操作系统中,若得到了admin权限,则再也没有什么不能做的事。在美国foundstone公司编撰的《黑客大曝光》[Hacking Exposed]一书中,也提到了一个能捕获ctrl + alt + del 三键序列之后的密码操作的工具,Invisible Keylogger Stealth (IKS),它能远程安装,安装后需要重启,之后就能运行在后台,偷偷窃取用户的密码,并将其记录在iks.dat 文件中,且该iks.dat 文件是二进制格式,需专用的datview程序解读,隐蔽性不可谓不好,不过这个程序仍然不是直接击败可信路径,而是破坏了目标机器的TCB,与GINA木马类似的,它也需要管理员权限,因为它是基于编制设备驱动程序来实现其功能的,而在一台WINNT机器上安全设备驱动,自然必须管理员才能完成操作。因此这仍然不能算是一个漏洞,从TCB概念的角度来分析也是如此,是TCB中的一部分改变了另一部分,记得我们前面所说的系统管理员也是TCB的构成部分吗?这里指的系统管理员并非具体的人,而是拥有管理权限的帐户,机器、程序是不会辨别人类的,谁控制了管理帐户,机器就听谁的指挥。
NT系列windows操作系统的启动过程中关于SAS的定义过程是:
初始化时GINA已经收到VOID WlxUseCtrlAltDel(HANDLE hWlx);这个函数它的作用就是通知winlogon.exe,GINA默认使用ctrl+alt+del这个标准SAS.如果要用自己定义SAS序列的话,开发者必须在编制自己的GINA.dll时
自行HOOK热键.并且通过:
WlxSasNotify(hGlobalWlx, dwSasType);
这个函数来报告将使用的SAS。
GINA将提供给winlogon.exe一个函数:
VOID WINAPI WlxDisplaySASNotice(PVOID pContext);
用于显示欢迎画面以及验证是否使用了自定义的SAS序列。
击败可信路径的方法:在linux等类似UNIX操作系统下,攻击者必须改变系统核心,由于核心是绝对信任自身的,而可信路径引发时,内核将无条件地杀死全部用户进程,因此逻辑上不存在能够一直潜伏在系统