文章列表
 
2008-12-10 9:55

陈皓

前言

       也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久。不过,在这里,我还是想讨论一下这个环境变量。因为这个环境变量所带来的安全问题非常严重,值得所有的Unix下的程序员的注意。

在开始讲述为什么要当心LD_PRELOAD环境变量之前,请让我先说明一下程序的链接。所谓链接,也就是说编译器找到程序中所引用的函数或全局变量所存在的位置。一般来说,程序的链接分为静态链接和动态链接,静态链接就是把所有所引用到的函数或变量全部地编译到可执行文件中。动态链接则不会把函数编译到可执行文件中,而是在程序运行时动态地载入函数库,也就是运行链接。所以,对于动态链接来说,必然需要一个动态链接库。动态链接库的好处在于,一旦动态库中的函数发生变化,对于可执行程序来说是透明的,可执行程序无需重新编译。这对于程序的发布、维护、更新起到了积极的作用。对于静态链接的程序来说,函数库中一个小小的改动需要整个程序的重新编译、发布,对于程序的维护产生了比较大的工作量。

当然,世界上没有什么东西都是完美的,有好就有坏,有得就有失。动态链接所带来的坏处和其好处一样同样是巨大的。因为程序在运行时动态加载函数,这也就为他人创造了可以影响你的主程序的机会。试想,一旦,你的程序动态载入的函数不是你自己写的,而是载入了别人的有企图的代码,通过函数的返回值来控制你的程序的执行流程,那么,你的程序也就被人“劫持”了。

LD_PRELOAD简介

UNIX的动态链接库的世界中,LD_PRELOAD就是这样一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入恶意程序,从而达到那不可告人的罪恶的目的。

我们知道,Linux的用的都是glibc,有一个叫libc.so.6的文件,这是几乎所有Linux下命令的动态链接中,其中有标准C的各种函数。对于GCC而言,默认情况下,所编译的程序中对标准C函数的链接,都是通过动态链接方式来链接libc.so.6这个函数库的。

OK。还是让我用一个例子来看一下用LD_PRELOADhack别人的程序。

示例一

测试一下程序:(得到正确结果)

$ ./verifypasswd asdf

Invalid Password!

设置LD_PRELOAD变量:(使我们重写过的strcmp函数的hack.so成为优先载入链接库)

       $ export LD_PRELOAD="./hack.so"

再次运行程序:

$ ./verifypasswd asdf

hack function invoked. s1=<password> s2=<asdf>

Correct Password!

我们可以看到,1)我们的hack.so中的strcmp被调用了。2)主程序中运行结果被影响了。如果这是一个系统登录程序,那么这也就意味着我们用任意口令都可以进入系统了。

       上面的这个preload.c文件也就早期的为人所熟知的hack程序了。恶意用户通过在系统中设计LC_PRELOAD环境变量来加载这个动态链接库,会非常容易影响其它系统命令(如:/bin/sh, /bin/ls, /bin/rm 等),让这些系统命令以Root权限运行。

让我们看一下这个函数是怎么影响系统命令的:

      

$ id

uid=500(hchen) gid=10(wheel) groups=10(wheel)

$ gcc -shared -o preload.so preload.c

$ setenv LD_PRELOAD ./preload.so

$ id

uid=0(root) gid=0(root) egid=10(wheel) groups=10(wheel)

       $ whoami

root

$ /bin/sh

#         <------ 你可以看到命令行提示符会由 $ 变成 #

      

下面是一个曾经非常著名的系统攻击

$ telnet

telnet> env def LD_PRELOAD /home/hchen/test/preload.so

telnet> open localhost

#

当然,这个安全BUG早已被Fix了(虽然,通过id或是whoami或是/bin/sh让你觉得你像是root,但其实你并没有root的权限),当今的Unix系统中不会出现这个的问题。但这并不代表,我们自己写的程序,或是第三方的程序能够避免这个问题,尤其是那些以Root方式运行的第三方程序。

所以,在我们编程时,我们要随时警惕着LD_PRELOAD

如何避免

不可否认,LD_PRELOAD是一个很难缠的问题。目前来说,要解决这个问题,只能想方设法让LD_PRELOAD失效。目前而言,有以下面两种方法可以让LD_PRELOAD失效。

1)通过静态链接。使用gcc-static参数可以把libc.so.6静态链入执行程序中。但这也就意味着你的程序不再支持动态链接。

2)通过设置执行文件的setgid / setuid标志。在有SUID权限的执行文件,系统会忽略LD_PRELOAD环境变量。也就是说,如果你有以root方式运行的程序,最好设置上SUID权限。(如:chmod 4755 daemon

在一些UNIX版本上,如果你想要使用LD_PRELOAD环境变量,你需要有root权限。但不管怎么说,这些个方法目前来看并不是一个彻底的解决方案,只是一个Workaround的方法,是一种因噎废食的做法,为了安全,只能禁用。

 
2008-12-10 8:52

虽然公司有健身房,但我很久没锻炼了,就一开始来公司的时候,和大家一起玩了两个月。昨天在群里听到K哥说牙疼的不行,貌似挺痛苦的,我就觉得我也应该运动下了。到了健身房,由于有同学在那边看着,还没热身,我就躺在那开始推杠铃了。。。虽然不重,好像100吧,推了20个也比较勉强了,然后跑了400米,出了点汗。后来再去推了下125推不动了。。。

结果今天早上起来,胸口那个痛啊……这验证了一句话,莫装B……

希望能坚持下去。

 
2008-12-10 8:37

This security update resolves four privately reported vulnerabilities. The vulnerabilities could allow remote code execution if a user views a specially crafted Web page using Internet Explorer.

http://www.microsoft.com/technet/security/Bulletin/MS08-073.mspx

现在看到补丁补了0day竟然会有快感,呵呵

 
2008-12-09 22:47

今天进了小学的QQ群,几个老同学有啊没啊的扯,但是内心是激荡的,10几20年前的场景貌似还尽在眼前。很感谢QQ,如果不是QQ,我压根没打算这辈子还能和这帮同学联系上,我压根也没奢望这辈子我还能再见着他们她们的。很多人都为人父母了。。。。。而我,还在深圳打拼着,亲人没在身边,想想挺郁闷的,不过想到小学的事,挺有意思的,想着想着会笑出声来,写下来和大家分享之……

学前班的时候,涉世未深,仅仅记得我好像当过小组长,负责收作业。班主任姓齐,现在我还知道她住哪。那时有个事我记得挺深刻的。以前下雨我们都会带伞去学校,雨停了,跑到学校里的某处,那里有两堆铁路铺路基用的石头,我们就分两边,互相用石头扔,同时用雨伞挡……现在想想都挺恐怖的,去看看铁路路基的石头有多大就知道了。那时我被黄X军同学给砸到了鼻子,顿时血流如注,被送到医院去,诊断为鼻梁砸断了,现在脱了眼镜会发现鼻梁上有个凸起,就是那时给留下的。但是我到现在为止都有个疑问,那时有那么大的劲扔那石头吗?虽然路基石也有小石头。

一年级,这个老师可以说是我的启蒙老师,她是我爸的同学,借着这个,我第一批加入了中国少先队,那一批整个学校只有12人加入。那时候,“红领巾”是多么值得骄傲的代名词啊,但之后由于“骂”老师是“臭老师”,红领巾被收回了,直到第三批才让我重新加入……在一到二年级,有下面几个事是让我印象深刻的:

1、那时玩的最多就是“过家家”了,酸咪粉里有一些小勺子什么的,然后不知道去哪里搞了一些小碗,用水把泥巴活湿润了,再找点小树枝什么的,然后大家就搞角色扮演,什么我做爸爸你做妈妈,你做儿子她做女儿,几个人玩的不亦乐乎。

2、小学嘛,到现在为止我也不知道为啥那时候会春心荡漾,但这春心荡漾的挺有规律,一般心仪的对象都是班干部。我也不例外,我喜欢的是我们班的劳动委员,并和几位对手竞争之……有意思的是,我们几位竞争对手的关系还很好的,呵呵,可见小孩子的心胸是多么的宽广啊 :)说到这个有个很搞笑的事,我们那时一致认为这位MM的长发放下来比较好看,所以就专门在放学后可能要洗头,或者周末的时间去找这位女同学,希望能碰到Y洗完头,看看她头发放下来美丽的样子。话说回来,此MM已为我一初中高中好友“走光”之妻,请恕小弟我年幼无知。

3、男孩嘛,当然少不了打架这一场景,说到打架,又难免扯到女人。那时候我和某个竞争对手(X哲)经常打架,那时我们的课室还在平房,下雨了,哪都去不了,没事干就在课室里打架,哈哈。那时候我的绰号是赤脚大仙,为啥要赤脚呢,因为打架容易把我们的小白鞋搞脏,回家了父母会说的,另外由于脱了鞋子的脚比较容易粘灰,脚底容易脏,踢在对方身上效果比较好,所以我打架的时候一般把鞋子脱了打,呵呵。那时候打架真的有意思,不像后来初中的打架比较暴力,那时候就是两个人要么扭在一起,要么追逐,对方的手脚落到我身上都不怎么疼(不知道我的手脚落在那哥们身上疼不),但打的动作还蛮大,称之为艺术一点都不为过。

那位启蒙老师只带我们带到了二年级,三年级的时候唐老师来带我们,我现在仍然记得她的样貌,应该是北方人,不过只带了我们一个学期,就由郭老师来带我们了,一直到小学毕业。

3年级-6年级的故事明天再继续记录下来。正在更新中……请继续刷新,呵呵

注:里面的一些概念和事情对某些8X后来说,不一定都可以全部理解和接受的,但那的确是我们那个年代盛行的东西。

 
2008-12-09 10:33

相信大家都有需求使用免費版本esx 3i ,3.5 遇到Clone,遷移,備份時候是個問題. 本身VI 連clone都沒有.

因為沒有 VMotion ,VMware Consolidated Backup 備份更麻煩點,這邊簡單分析狀況並寫入實務經驗.(待補)

這邊不牽扯到Cluster Storage . 只簡單分析如何VM 從實體A主機轉到B主機

VM converter


http://www.vmware.com/products/converter/

免費Vm converter ,可做到Clone,遷移,備份(導出VMDK檔案) 並可修改虛擬硬碟大小功能.但是要Host VM 關機下運作 似乎有點不太方便 因萬轉移時間頗久,停掉服務恐怕有點問題

不過在沒預算下總是可用工具

VM_Explorer


vmexplorer.png

VM Explorer 不需vcb licenese 運作,免費版VMware Esx 3i 和3.5 Basic 都可以用,做虛擬機複製備份,可不關機.

轉移好的VM處於os 關機狀態 非快照熱運作狀態. 但是檔案跟下達備份指令那刻一樣(除了SWAP檔)
除了複製一份VM到另外一台網路上 ESX host外
也可把back up file 丟到任何一台 網路上你有權限的Windows 與 Linux 主機

错误.jpg

http://www.trilead.com/Products/VM_Explorer/

五台機器內免費

Veeam backup


http://www.veeam.com/vmware-esx-backup.html

Veeam backup 不需vcb licenese 運作,免費版VMware Esx 3i 和3.5 Basic 都可以用,做虛擬機複製備份,可不關機.
官方宣稱Target VM server不可為ESX 3i,備份出來檔案為自己的檔案格式vbk(似乎已修改)

轉移好的VM處於os 關機狀態 非快照熱運作狀態. 但是檔案跟下達備份指令那刻一樣(除了SWAP檔)

除了複製一份VM到另外一台網路上 ESX host外
也可把back up file 丟到任何一台 網路上你有權限的Linux 主機


指令集


使用vcbMounter,會自動作個快照並且備份 .

       

附上的夾檔原作者為 jaben

出自於 http://bbs.vmware.cn/thread-15139-1-1.html

 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

包子,请教下关于php代码中嵌入<!--# include file="/tmp/test.html" -->的问题,404
 

好文
 

操你大爷
 

....踩一下
 

[表情]
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu