让你的Linux桌面更安全
好不容易把桌面都移植到ubuntu里来了,虽然有点不适应,但是还是可以接受了。(牢骚、1.4G cpu +512内存跑vista我都可以接受,还有什么是不能接受的。。。)本文介绍了包子在Linux桌面应用安全方面的一些经验和心得,主要以ubuntu为主题,并涉及到CentOS和Gentoo等发行版,相对还是比较通用的,本人学艺不精,无法对pax进行代码级别的诠释,不足之处还请各位看官不吝斧正。请关注http://baoz.net 和 http://xsec.org 获得 新版本。
还有这个文章我只打算做一个HOWTO,告诉我们如何保护自己linux桌面的安全,我并不打算把里面涉及的所有术语和程序都解释的十分清楚,如果看官您对本文的某些地方有不懂的,可以先google一下。
一、背景
1、为什么选ubuntu因为简单好用,一装好,基本什么都配置的差不多了,我们只需要装个字体什么的,配置一下就可以用了,我在这之前用过 gentoo,无可否认,gentoo是十分优秀的发行版,但我个人觉得不适合我这种爱好升级的懒人,因为我在升级的时候总是出现很多RPWT,虽然大部分问题都可以在 forums.gentoo.org找到答案,这个是gentoo十分优秀的地方,他有一个论坛,只要在那里搜索,基本可以找到问题的答案,如果找不到,要么当了小白鼠,要么就是RPWT,gentoo还有一个很好的地方就是我觉得她们比较关心安全,明显的有一个hardened-gentoo,很不错,还有他的genkernel,只需要这个命令,他就会自己给你配置内核了,我们需要的就是make install,编译内核十分方便。而且我很害怕配置X,可能是因为大学的时候刚开始接触linux的时候被搞怕了吧,设置那什么fonts.conf文件,人都快搞晕了,搞了N久还是没搞好,不过这个事情也把我导向了学习linux的正途,我个人认为抛弃图形界面学习linux是 好的,那样逼着你用 cli,尽可能掌握更多的命令,尽可能更熟悉vi。
2、环境
IBM R50E 1.4G CPU 512M内存 集成的intel显卡
ubuntu 6.10
3、要求
读者必须会使用linux下的编辑器
读者必须会自己编译内核
读者必须知道怎么去掉代码里的注释
4、适合人群
关心自己系统安全的linux桌面用户
注意:近期有RPWT的朋友请慎用,并备份旧内核,本人对下面过程中出现的RPWT和非RPWT而导致的任何意外和非意外都不负有任何连带责任。
二、基本安全
1、口令安全:不要使用简单的密码
2、关闭ssh服务:如果你不需要远程控制你的系统的话,关闭ssh服务,ubuntu默认是没有安装这个服务的。
baoz@laptop:~$ sudo update-rc.d -f ssh remove
Removing any system startup links for /etc/init.d/ssh ...
3、BIOS密码:不要让别人用livecd进入你的系统
4、sulogin:ubuntu在这个方面做的很好,单用户进入系统还是需要密码的,因为使用的是sulogin,这个已经设置好了的,我们不需要去动,我就是介绍一下 、)
5、用普通用户登录:这个ubuntu做的很好,强迫使用普通用户,装好系统的时候先给root设置密码,sudo passwd root 就可以修改root密码了。
6、防止社会工程攻击:说白了,社会工程就是欺骗,忽悠,骗人,呵呵,当然这个骗人可能是骗了一个人,或者骗了N个人。
A、骗一个人:比如某人发给你一个elf程序,说这个程序是怎么怎么怎么的,让你试试,这个时候,你可千万不要随便执行,特别是执行这个文件需要 root权限的时候,更加不 要执行,我们可以先用strings命令查看这个程序里面的一些字符,看看有没明显的backdoor password或者bot这样的字眼。
baoz@laptop:/tmp$ strings unknown.elf | more
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
stdout
strerror
snprintf
__strtol_internal
qsort
fgets
memcpy
feof
malloc
optarg
readdir
__stack_chk_fail
如果你很想知道这个程序到底做了什么并且你比较自信的话,你可以使用strace -o aa ./unknown.elf,用strace跟一下,然后用more aa命令看看这个程序到底对你的系统进行了一些什么操作
baoz@laptop:/tmp$ strace -o aa ./unknown.elf
baoz@laptop:/tmp$ more aa
execve("./unknown.elf", ["./unknown.elf"], [/* 41 vars */]) = 0
brk(0) = 0x8066260
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4f336000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=90086, ...}) = 0
mmap2(NULL, 90086, PROT_READ, MAP_PRIVATE, 3, 0) = 0x4f320000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
不过我还是建议在使用strace的时候先用aide之类的程序对我们的HOME目录进行一个校验,或者我们大概看看我们的HOME目录下的bashrc profile之类的程序,因为我们可以防止未知程序修改我们的用户登录脚本。如果你不是十分自信,请在断网的情况下使用strace跟踪程序,并且在跟踪完毕之后重新启动系统并检查启动脚本是否被更改。还是要提醒一下,千万别用root用户来跟踪程序,因为所谓的用strace跟踪,是要执行未知程序一次的。。。。。。还有一个事情要提醒大家的是,如果我们使用file命令查看这个unknown.elf,发现他不是一般的elf文件,就是他加密了或者压缩了,那么我们要考虑是否要放弃跟踪了。
B、骗一票人:社会工程的更高境界,需要一定水平和层次,如何骗一票人呢?大致有几个办法:
a、制作一个貌似很好用,很受欢迎的程序,发布其源代码,或者代码根本无法正常编译,同时发布其二进制文件,并在其中植入后门。不是我崇洋媚外,我们要特别小心我们中国人玩这一手,为什么要特别小心中国人,因为不少中国人好这一口,并且没有什么事情中国人做不出来的。说白了,就是当你遇到一个程序,他无法提供代码或者代码无法编译的时候,我们不要用他的elf文件,无论这个程序写的多好,想想,我们都可以从windows迁移到linux了,可以放弃那么多好用的软件不用了,难道我不用你这个软件我就活不下去?呵呵
b、自己制作系统升级镜像网站,包括CentOS/RHEL的apt/yum和debian/ubuntu的source还有gentoo的 MIRROR我们都要小心,在这些很优秀的包管理程序给我们带来了极大的方便,同时国内很多热心的朋友充分利用自己的资源给大家提供了国内的升级镜像,但是我们在升级的过程中必须注意,你升级的软件很可能由于两个原因被修改了(镜像服务器主人故意放置后门和镜像服务器被入侵,比如openssh程序被加入后门或者apache的默认启动的模块被替换),但是在升级的过程中,apt或许只是会给你一个简单的警告,如果你顺手的按了一下Y,你的系统就很可能被植入了后门。下面我们详细的说说:
CentOS的apt其实还是RPM,我们可以自己打包程序成RPM文件并发布,安装的时候系统不会提出特别的警告,所以这个是十分危险的。。。如果你很关心系统安全,建议大家都从官方网站更新程序。
debian/ubuntu系列,纯正的apt,安装的时候有签名校验检查,在安装和签名不符合的deb的时候会报警,说到这个我很奇怪,我记得我安装 ubuntu610之后,我apt-get upgrade,系统竟然报glftp没通过认证:( 所以当我们apt-get install 或者upgrade的时候,千万记得小心看,不要随便按Y。警告大致是这样“【警告】:下列的软件包不能通过验证!”
gentoo系列,通过SYNC下载软件数据,通过MIRROR下载软件包,这两个东西可以在不同的站点下载,也可以在同一个站点下载。建议大家把 SYNC和MIRROR设置成不同的服务器,这样在被修改了的软件包下载回来安装的时候,校验就会出错并拒绝安装,我印象中至少有MD5和SHA1校验。这样使用的话,基本上就很安全了。
c、官方网站被入侵,相关软件被替换,这个没什么好说的了,认了吧,呵呵。
三、防止溢出攻击
1、什么是溢出攻击
略去N行。。。。。。。。有兴趣知道什么是溢出攻击的朋友可以去google搜索一下。
2、基于linux先天相对比较安全并在我们做了上述的操作之后,我们的ubuntu系统基本上可以对抗物理接触的攻击(除非拆你的硬盘。。。。),但是面对远程的威胁,我们还是需要做一些防范的,我们一起来想想,作为一个桌面机,什么东西给了别人一个远程进入的口子:
在线交流程序:QQ、MSN、Skype、IRC等
网站浏览和下载程序:Firefox、Mail、BT和Emule client等,需要特别注意的是firefox的extention其实也很危险的
本地打开的一些文件:比如pdf、ppt、doc等等
虽然linux很安全,但是我们不排除eva lumaqq gaim 或者xchat这样的程序有安全方面的问题,其实答案很明显,我们想想,连apache这种代码被N个人审核了N次的东西都有安全方面的漏洞,何况是那种或许基本没有做过专业安全审核的代码,我没有任何鄙视或者诋毁eva和lumaqq作者劳动成果的意思,而且我是他们辛勤劳动的受益者,感谢都来不及,可是这些软件做的是那么的出色,我们又必须要使用他们,怎么办呢?有没一个通用的防溢出攻击的办法呢?
3、PAX
pax是一个linux下的的防溢出程序,他主要有不可执行(non-exec)和随机地址(ASLR,Address Space Layout Randomization),就这两招,基本就可以把大部分溢出攻击给干掉了,还有一些攻击方式干不掉,具体内容很多了,有兴趣详细了解pax的朋友可以去pax.grsecurity.org/doc/下面阅读文档,说的很详细的:)现在跟的上内核发展的防溢出程序也就exec-shield和pax了,exec-shield是redhat搞的,也是以内核补丁的形式出现,功能不如pax多,随机地址功能貌似是没有的,其他的几个都停滞了。
A、准备工作
下载 新的pax for linux kernel patch和paxtest
http://www.grsecurity.net/~paxguy1
现在 新的是http://www.grsecurity.net/~paxguy1/pax-linux-2.6.19.2-test7.patch和http://www.grsecurity.net/~paxguy1/paxtest-0.9.7-pre5.tar.gz
B、给内核打上pax补丁,并选择pax相关部分
root@laptop:/usr/src/linux# patch -p1 < ../pax-linux-2.6.19.2-test7.patch
root@laptop:/usr/src/linux# make menuconfig
Linux Kernel Configuration-->Security options(这里下面的两个enable全部去掉)-->PaX里,除了Pax Control里的soft mode和MAC system,我们全部都设置为y,就是编译进内核。
选择好了的结果大致如下
root@laptop:/usr/src/linux# grep PAX .config
CONFIG_PAX=y
# CONFIG_PAX_SOFTMODE is not set
CONFIG_PAX_EI_PAX=y
CONFIG_PAX_PT_PAX_FLAGS=y
CONFIG_PAX_NO_ACL_FLAGS=y
# CONFIG_PAX_HAVE_ACL_FLAGS is not set
# CONFIG_PAX_HOOK_ACL_FLAGS is not set
CONFIG_PAX_NOEXEC=y
CONFIG_PAX_PAGEEXEC=y
CONFIG_PAX_SEGMEXEC=y
# CONFIG_PAX_DEFAULT_PAGEEXEC is not set
CONFIG_PAX_DEFAULT_SEGMEXEC=y
CONFIG_PAX_EMUTRAMP=y
CONFIG_PAX_MPROTECT=y
CONFIG_PAX_NOELFRELOCS=y
CONFIG_PAX_ASLR=y
CONFIG_PAX_RANDKSTACK=y
CONFIG_PAX_RANDUSTACK=y
CONFIG_PAX_RANDMMAP=y
CONFIG_PAX_MEMORY_SANITIZE=y
CONFIG_PAX_MEMORY_UDEREF=y
C、编译并安装新内核
root@laptop:/usr/src/linux# make; make modules; make modules_install; make install
之后修改一下grub配置文件
root@laptop:/usr/src/linux# vi /boot/grub/menu.lst
reboot 祝你好运……
D、使用和设置pax
a、安装好pax之后,我们利用官方提供的paxtest程序来检测pax的效果。
先编译一下paxtest程序,根据不同的操作系统,选择不同的make参数。
baoz@laptop:~/kernel/paxtest-0.9.7-pre5$ make
Choose one of the following make targets:
adamantix Adamantix
gentoo Gentoo
openbsd OpenBSD
generic For other Linux distributions
clean Clean up
我们是ubuntu,使用generic参数编译就好。
baoz@laptop:~/kernel/paxtest-0.9.7-pre5$ make generic
我们可以在编辑过程中注意到chpax执行了下面的操作,chpax是和pactl一类东西,都是修改文件的pax属性的,为了测试这些程序,给他们加上了一些特殊的属性。
-P enforce paging based non-executable pages
-X randomize ET_EXEC base [ELF only]
-S enforce segmentation based non-executable pages
./chpax -X rettofunc1x
./chpax -X rettofunc2x
./chpax -X getmain1
./chpax -S getstack1
./chpax -P getstack2
我们有两种检测方式kiddie和blackhat模式,顾名思义,就是针对不同的入侵者的检测模式,好像结果都一样,就用黑帽子模式吧 :)
下面是没有PaX的输出,等会我们可以对比一下。
baoz@laptop:~/kernel/paxtest-0.9.7-pre5$ ./paxtest blackhat
PaXtest - Copyright(c) 2003,2004 by Peter Busser <peter@adamantix.org>
Released under the GNU Public Licence version 2 or later
Writing output to paxtest.log
It may take a while for the tests to complete
Test results:
PaXtest - Copyright(c) 2003,2004 by Peter Busser <peter@adamantix.org>
Released under the GNU Public Licence version 2 or later
Mode: blackhat
Linux laptop 2.6.19.2 #11 Fri Jan 26 07:24:00 CST 2007 i686 GNU/Linux
Executable anonymous mapping : Vulnerable
Executable bss : Vulnerable
Executable data : Vulnerable
Executable heap : Vulnerable
Executable stack : Vulnerable
Executable anonymous mapping (mprotect) : Vulnerable
Executable bss (mprotect) : Vulnerable
Executable data (mprotect) : Vulnerable
Executable heap (mprotect) : Vulnerable
Executable shared library bss (mprotect) : Vulnerable
Executable shared library data (mprotect): Vulnerable
Executable stack (mprotect) : Vulnerable
Anonymous mapping randomisation test : 9 bits (guessed)
Heap randomisation test (ET_EXEC) : No randomisation
Heap randomisation test (ET_DYN) : No randomisation
Main executable randomisation (ET_EXEC) : No randomisation
Main executable randomisation (ET_DYN) : No randomisation
Shared library randomisation test : 10 bits (guessed)
Stack randomisation test (SEGMEXEC) : 11 bits (guessed)
Stack randomisation test (PAGEEXEC) : 11 bits (guessed)
Return to function (strcpy) : Vulnerable
Return to function (strcpy, RANDEXEC) : Vulnerable
Return to function (memcpy) : Vulnerable
Return to function (memcpy, RANDEXEC) : Vulnerable
Executable shared library bss : Vulnerable
Executable shared library data : Vulnerable
Writable text segments : Vulnerable
下面是有PaX保护的输出。
baoz@laptop:~/kernel/paxtest-0.9.7-pre5$ ./paxtest
usage: paxtest [kiddie|blackhat]
baoz@laptop:~/kernel/paxtest-0.9.7-pre5$ ./paxtest blackhat
PaXtest - Copyright(c) 2003,2004 by Peter Busser <peter@adamantix.org>
Released under the GNU Public Licence version 2 or later
Writing output to paxtest.log
It may take a while for the tests to complete
Test results:
PaXtest - Copyright(c) 2003,2004 by Peter Busser <peter@adamantix.org>
Released under the GNU Public Licence version 2 or later
Mode: blackhat
Linux laptop 2.6.19.2 #10 Tue Jan 23 20:21:22 CST 2007 i686 GNU/Linux
Executable anonymous mapping : Killed
Executable bss : Killed
Executable data : Killed
Executable heap : Killed
Executable stack : Killed
Executable anonymous mapping (mprotect) : Killed
Executable bss (mprotect) : Killed
Executable data (mprotect) : Killed
Executable heap (mprotect) : Killed
Executable shared library bss (mprotect) : Killed
Executable shared library data (mprotect): Killed
Executable stack (mprotect) : Killed
Anonymous mapping randomisation test : 17 bits (guessed)
Heap randomisation test (ET_EXEC) : 13 bits (guessed)
Heap randomisation test (ET_DYN) : 23 bits (guessed)
Main executable randomisation (ET_EXEC) : No randomisation
Main executable randomisation (ET_DYN) : 15 bits (guessed)
Shared library randomisation test : 17 bits (guessed)
Stack randomisation test (SEGMEXEC) : 23 bits (guessed)
Stack randomisation test (PAGEEXEC) : 23 bits (guessed)
Return to function (strcpy) : Vulnerable
Return to function (strcpy, RANDEXEC) : Vulnerable
Return to function (memcpy) : Vulnerable
Return to function (memcpy, RANDEXEC) : Vulnerable
Executable shared library bss : Killed
Executable shared library data : Killed
Writable text segments : Killed
从上面的信息我们可以看到,什么东西是被保护的(killed),什么东西是不被保护的(vulnerable)
b、首先我们要安装打了补丁的binutils
下载bintutils和补丁:
打补丁:
baoz@laptop:~/kernel$ tar xfj binutils-2.17.tar.bz2
baoz@laptop:~/kernel$ cd binutils-2.17/
baoz@laptop:~/kernel/binutils-2.17$ patch -p1 < ../binutils-2.17-pt-pax-flags-200607012130.patch
安装:
baoz@laptop:~/kernel/binutils-2.17$ ./configure --prefix=/usr; make;sudo make install
c、调试信息
当我们发现以前工作正常的程序现在无法运行的时候,可能就是因为pax拦截了,主要包括java和xine
baoz@laptop:~$ which java
/usr/lib/jvm/java-1.5.0-sun/bin/java
baoz@laptop:~$ java
杀死
我们dmesg看看
baoz@laptop:~$ dmesg
[ 704.026090] PAX: execution attempt in: <anonymous mapping>, 44803000-4482b000 44803000
[ 704.026100] PAX: terminating task: /usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/bin/java(java):3431, uid/euid: 1000/1000, PC: 44803040, SP: 58cea3ac
[ 704.026106] PAX: bytes at PC: 55 8b 6c 24 08 53 56 9c 58 50 8b c8 81 f0 00 00 04 00 50 9d
[ 704.026118] PAX: bytes at SP-4: 00000006 49b56d60 49bad3c0 0000000c 58cea3d0 4985ca24 00000006 ffffffff 000000c9 49baeaec 000000f4 58cea4b0 58cea408 4985c6f2 58cea3f8 58cea4b0 000000f4 08069ca0 49b91c4a 49baeaec 58cea418
这样我们基本上可以确认是PaX拦截了。
d、安装paxctl特殊设置
出现上面的问题,给我们的使用带来一些不方便,比如我们要运行lumaqq或者要用xine引擎看电影就出问题了。我们可以使用paxctl程序针对这些出问题的程序稍微设置一下,给他们点特权。
安装paxctl
baoz@laptop:~$ sudo apt-get install paxctl
baoz@laptop:~$ sudo paxctl
PaX control v0.4
Copyright 2004,2005,2006 PaX Team <pageexec@freemail.hu>
usage: paxctl <options> <files>
options:
-p: disable PAGEEXEC -P: enable PAGEEXEC
-e: disable EMUTRMAP -E: enable EMUTRMAP
-m: disable MPROTECT -M: enable MPROTECT
-r: disable RANDMMAP -R: enable RANDMMAP
-x: disable RANDEXEC -X: enable RANDEXEC
-s: disable SEGMEXEC -S: enable SEGMEXEC
-v: view flags -z: restore default flags
-q: suppress error messages -Q: report flags in short format
-c: convert PT_GNU_STACK into PT_PAX_FLAGS (see manpage!)
-C: create PT_PAX_FLAGS (see manpage!)
看完之后有点郁闷,paxctl提到了manpage,但他貌似没给我们man page。。。。。没关系,当回小白鼠吧,呵呵。
一般情况下我们把PT_GNU_STACK转换成PT_PAX_FLAGS就可以用paxctl来控制了,但貌似java要Create PT_PAX_FLAGS,没关系了,呵呵
baoz@laptop:~$ sudo paxctl -c `which java`
file /usr/lib/jvm/java-1.5.0-sun/bin/java does not have a PT_GNU_STACK program header, conversion failed
baoz@laptop:~$ sudo paxctl -C `which java`
file /usr/lib/jvm/java-1.5.0-sun/bin/java got a new PT_PAX_FLAGS program header
这个时候我们看看java程序的flags
baoz@laptop:~$ paxctl -v `which java`
PaX control v0.4
Copyright 2004,2005,2006 PaX Team <pageexec@freemail.hu>
- PaX flags: -------x-e-- [/usr/lib/jvm/java-1.5.0-sun/bin/java]
RANDEXEC is disabled
EMUTRAMP is disabled
我们现在修改一下pax flag,去掉mprotect标志
baoz@laptop:~$ sudo paxctl -m `which java`
baoz@laptop:~$ paxctl -v `which java`
PaX control v0.4
Copyright 2004,2005,2006 PaX Team <pageexec@freemail.hu>
- PaX flags: -----m-x-e-- [/usr/lib/jvm/java-1.5.0-sun/bin/java]
MPROTECT is disabled
RANDEXEC is disabled
EMUTRAMP is disabled
现在我们就可以运行java程序了,也可以用lumaqq了,xine我们如法炮制,只要程序运行不到了,我们就可以这样操作,一个一个标志去掉,如果嫌烦的话,我们直接加 -pemrxs好了。
下面我们针对xchat设置一下,让他达到比较高的级别
baoz@laptop:~$ sudo paxctl -C `which xchat`
baoz@laptop:~$ sudo paxctl -v `which xchat`
PaX control v0.4
Copyright 2004,2005,2006 PaX Team <pageexec@freemail.hu>
- PaX flags: -------x-e-- [/usr/bin/xchat]
RANDEXEC is disabled
EMUTRAMP is disabled
设置到 大保护级别:
baoz@laptop:~$ sudo paxctl -REMRXS `which xchat`
baoz@laptop:~$ sudo paxctl -v `which xchat`
PaX control v0.4
Copyright 2004,2005,2006 PaX Team <pageexec@freemail.hu>
- PaX flags: --S-M-X-E-R- [/usr/bin/xchat]
SEGMEXEC is enabled
MPROTECT is enabled
RANDEXEC is enabled
EMUTRAMP is enabled
RANDMMAP is enabled
然后我们在konsole里运行xchat,这样我们可以看到错误信息,结果是xchat可以正常运行了,如果出现错误,我们就一个一个标志的去掉,直到可以运行为止。
还有我们可以查看dmesg来找到错误的信息的 :)