分享
 
 
 

UNIX系统编程常用库函数说明 (3)

王朝system·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

(4)加密子程序

1977年1月,NBS宣布一个用于美国联邦政府ADP系统的网络的标准加密法:数

据加密标准即DES用于非机密应用方面.DES一次处理64BITS的块,56位的加

密键.

*setkey(),encrypt():提供用户对DES的存取.

此两子程序都取64BITS长的字符数组,数组中的每个元素代表一个位,为0

或1.setkey()设置将按DES处理的加密键,忽略每第8位构成一个56位的加

密键.encrypt()然后加密或解密给定的64BITS长的一块,加密或解密取决

于该子程序的第二个变元,0:加密 1:解密.

*crypt():是UNIX系统中的口令加密程序,也被/usr/lib/makekey命令调用.

Crypt()子程序与crypt命令无关,它与/usr/lib/makekey一样取8个字符长

的关键词,2个salt字符.关键词送给setkey(),salt字符用于混合encrypt()

中的DES算法,最终调用encrypt()重复25次加密一个相同的字符串.

返回加密后的字符串指针.

(5)运行shell

*system():运行/bin/sh执行其参数指定的命令,当指定命令完成时返回.

*popen():类似于system(),不同的是命令运行时,其标准输入或输出联到由

popen()返回的文件指针.

二者都调用fork(),exec(),popen()还调用pipe(),完成各自的工作,因而

fork()和exec()的安全方面的考虑开始起作用.

3.写安全的C程序

一般有两方面的安全问题,在写程序时必须考虑:

(1)确保自己建立的任何临时文件不含有机密数据,如果有机密数据,设置

临时文件仅对自己可读/写.确保建立临时文件的目录仅对自己可写.

(2)确保自己要运行的任何命令(通过system(),popen(),execlp(),

execvp()运行的命令)的确是自己要运行的命令,而不是其它什么命

令,尤其是自己的程序为SUID或SGID许可时要小心.

第一方面比较简单,在程序开始前调用umask(077).若要使文件对其他人可

读,可再调chmod(),也可用下述语名建立一个"不可见"的临时文件.

Creat("/tmp/xxx",0);

file=open("/tmp/xxx",O_RDWR);

unlink("/tmp/xxx");

文件/tmp/xxx建立后,打开,然后断开链,但是分配给该文件的存储器并未删

除,直到最终指向该文件的文件通道被关闭时才被删除.打开该文件的进程

和它的任何子进程都可存取这个临时文件,而其它进程不能存取该文件,因

为它在/tmp中的目录项已被unlink()删除.

第二方面比较复杂而微妙,由于system(),popen(),execlp(),execvp()执行

时,若不给出执行命令的全路径,就能"骗"用户的程序去执行不同的命令.因

为系统子程序是根据PATH变量确定哪种顺序搜索哪些目录,以寻找指定的命

令,这称为SUID陷井.最安全的办法是在调用system()前将有效UID改变成实

际UID,另一种比较好的方法是以全路径名命令作为参数.execl(),execv(),

execle(),execve()都要求全路径名作为参数.有关SUID陷井的另一方式是

在程序中设置PATH,由于system()和popen()都启动shell,故可使用shell句

法.如:

system("PATH=/bin:/usr/bin cd");

这样允许用户运行系统命令而不必知道要执行的命令在哪个目录中,但这种

方法不能用于execlp(),execvp()中,因为它们不能启动shell执行调用序列

传递的命令字符串.

关于shell解释传递给system()和popen()的命令行的方式,有两个其它的问

题:

*shell使用IFS shell变量中的字符,将命令行分解成单词(通常这个

shell变量中是空格,tab,换行),如IFS中是/,字符串/bin/ed被解释成单词

bin,接下来是单词ed,从而引起命令行的曲解.

再强调一次:在通过自己的程序运行另一个程序前,应将有效UID改为实际的

UID,等另一个程序退出后,再将有效UID改回原来的有效UID.

SUID/SGID程序指导准则

(1)不要写SUID/SGID程序,大多数时候无此必要.

(2)设置SGID许可,不要设置SUID许可.应独自建立一个新的小组.

(3)不要用exec()执行任何程序.记住exec()也被system()和popen()调用.

. 若要调用exec()(或system(),popen()),应事先用setgid(getgid())

将有效GID置加实际GID.

. 若不能用setgid(),则调用system()或popen()时,应设置IFS:

popen("IFS=\t\n;export IFS;/bin/ls","r");

. 使用要执行的命令的全路径名.

. 若不能使用全路径名,则应在命令前先设置PATH:

popen("IFS=\t\n;export IFS;PATH=/bin:/usr/bin;/bin/ls","r");

. 不要将用户规定的参数传给system()或popen();若无法避免则应检查

变元字符串中是否有特殊的shell字符.

. 若用户有个大程序,调用exec()执行许多其它程序,这种情况下不要将

大程序设置为SGID许可.可以写一个(或多个)更小,更简单的SGID程序

执行必须具有SGID许可的任务,然后由大程序执行这些小SGID程序.

(4)若用户必须使用SUID而不是SGID,以相同的顺序记住(2),(3)项内容,并

相应调整.不要设置root的SUID许可.选一个其它户头.

(5)若用户想给予其他人执行自己的shell程序的许可,但又不想让他们能

读该程序,可将程序设置为仅执行许可,并只能通过自己的shell程序来

运行.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有