linux中文件保存的代码,Linux有效的,真实的,保存的,伪代码中的文件系统UID操作...

我花了一些时间在Groovy中的一些代码上,使Linux UID操作对自己的混淆更少一些,因为手册页很杂乱。结果就是一个TestCase,它是为了显示setuid,seteuid,setfsuid,setreuid和setresuid调用引发的情况。没有考虑关于返回的错误代码的细节(或不)。Linux有效的,真实的,保存的,伪代码中的文件系统UID操作

问题基本上是:我错过了什么吗?

/**

* This is some Groovy code to explain Linux privilege handling

* The manipulable data structure is "PermVector", and it is manipulated through a

* TestCase.

*/

class PermissionTestCase extends GroovyTestCase {

class PermVector {

int ruid // real UID; affects the permissions for sending signals

int euid // effective UID; affects file creation and access

int suid // saved UID

int fsuid // filesystem UID; access control to the file system for NFS in Linux

/**

* The permission vector of a process that is created from a parent process

* having the given parent_euid, with its executable file having the given

* exe_suid_bit and being owned by the given exe_uid

*/

PermVector(Map params) {

ruid = params.parent_euid // is this right??

euid = params.parent_euid

suid = params.exe_suid_bit ? params.exe_uid : params.parent_euid

fsuid = params.parent_euid // is this right??

}

/**

* What does it mean for a process to be "privileged"?

*/

def isPrivileged() {

return euid == 0

}

/**

* Helper

*/

private def euid_part(int new_euid) {

if (isPrivileged() ||

(new_euid == ruid || new_euid == euid || new_euid == suid)) {

return new_euid

}

else {

throw new IllegalStateException("Nixed euid ${euid} to ${new_euid}")

}

}

/**

* Helper

*/

private def ruid_part(int new_ruid) {

if (isPrivileged() || (new_ruid == ruid || new_ruid == euid)) {

return new_ruid

}

else {

throw new IllegalStateException("Nixed ruid ${ruid} to ${new_ruid}")

}

}

/**

* Helper

*/

private def suid_part(int new_suid) {

if (isPrivileged() ||

(new_suid == ruid || new_suid == euid || new_suid == suid)) {

return new_suid

}

else {

throw new IllegalStateException("Nixed suid ${suid} to ${new_suid}")

}

}

/**

* Helper

*/

private def ruid_part_for_setresuid(int new_ruid) {

if (isPrivileged() ||

(new_ruid == ruid || new_ruid == euid || new_ruid == suid)) {

return new_ruid

}

else {

throw new IllegalStateException("Nixed ruid ${ruid} to ${new_ruid}")

}

}

/**

* Behaviour of SETREUID(2)

*/

def setreuid(int new_ruid, int new_euid) {

int next_euid = euid_part(new_euid)

int next_ruid = ruid_part(new_ruid)

if (next_euid != euid || next_ruid != ruid) {

suid = next_euid

}

euid = next_euid

ruid = next_ruid

fsuid = next_euid

}

/**

* Behaviour of SETEUID(2)

*/

def seteuid(int new_euid) {

if (isPrivileged()) {

euid = new_euid

fsuid = new_euid

}

else {

if (new_euid == ruid || new_euid == euid || new_euid == suid) {

euid = new_euid

fsuid = new_euid

// glibc 2.1 and later do not change the suid!

}

else {

throw new IllegalStateException("Nixed euid ${euid} to ${new_euid}")

}

}

}

/**

* Behaviour of SETUID(2)

*/

def setuid(int new_euid) {

if (isPrivileged()) {

euid = new_euid

ruid = new_euid

suid = new_euid

fsuid = new_euid

}

else {

if (new_euid == ruid || new_euid == suid) {

euid = new_euid

fsuid = new_euid

}

else {

throw new IllegalStateException("Nixed euid ${euid} to ${new_euid}")

}

}

}

/**

* Behaviour of SETFSUID(2)

*/

def setfsuid(int new_fsuid) {

if (isPrivileged()) {

fsuid = new_fsuid

}

else {

if (new_fsuid == ruid || new_fsuid == euid ||

new_fsuid == suid || new_fsuid == fsuid) {

fsuid = new_fsuid

}

else {

throw new IllegalStateException("Nixed fsuid ${fsuid} to ${new_fsuid}")

}

}

}

/**

* Behaviour of SETRESUID(2)

*/

def setresuid(int new_ruid, int new_euid, int new_suid) {

int next_ruid = new_ruid==-1 ? ruid : ruid_part_for_setresuid(new_ruid)

int next_euid = new_euid==-1 ? euid : euid_part(new_euid)

int next_suid = new_suid==-1 ? suid : suid_part(new_suid)

ruid = next_ruid

euid = next_euid

suid = next_suid

fsuid = next_euid

}

/**

* Printing

*/

String toString() {

return "[ruid:${ruid}, euid:${euid}, suid:${suid}, fsuid:${fsuid}]"

}

}

/**

* Use case: drop privileges for good

*/

void testDropPrivilegesFromRoot() {

PermVector pv =

new PermVector(parent_euid : 0, exe_suid_bit : false, exe_uid : 500)

System.out << "Dropping privileges from ${pv} using setuid(1000) .... "

pv.setuid(1000)

System.out << "now at ${pv}\n"

assertEquals(1000, pv.ruid)

assertEquals(1000, pv.euid)

assertEquals(1000, pv.suid)

assertEquals(1000, pv.fsuid)

}

/**

* Use case: elevate privileges, do some work, then drop privileges again

*/

void testElevatePrivilegesTemporarily() {

PermVector pv =

new PermVector(parent_euid : 500, exe_suid_bit : true, exe_uid : 0)

System.out << "Elevating privileges from ${pv} using setreuid(500,0) .... "

pv.setreuid(500,0)

System.out << "now at ${pv}, doing privileged work .... "

assertEquals(500, pv.ruid)

assertEquals(0, pv.euid)

assertEquals(0, pv.suid)

assertEquals(0, pv.fsuid)

System.out << "dropping back .... "

pv.setuid(500)

System.out << "now at ${pv}\n"

assertEquals(500, pv.ruid)

assertEquals(500, pv.euid)

assertEquals(500, pv.suid)

assertEquals(500, pv.fsuid)

}

/**

* Use case: drop privileges, do some work, then elevate privileges again

*/

void testDropPrivilegesTemporarily() {

PermVector pv =

new PermVector(parent_euid : 0, exe_suid_bit : false, exe_uid : 500)

System.out << "Dropping privileges from ${pv} using setreuid(0,500) .... "

pv.setreuid(0, 500)

System.out << "now at ${pv} ... doing unprivileged work safely .... "

assertEquals(0, pv.ruid)

assertEquals(500, pv.euid)

assertEquals(500, pv.suid)

assertEquals(500, pv.fsuid)

System.out << "elevating .... "

pv.setuid(0)

System.out << "back at ${pv}\n"

assertEquals(0, pv.ruid)

assertEquals(0, pv.euid)

assertEquals(500, pv.suid)

assertEquals(0, pv.fsuid)

}

}

+0

这看起来对我来说是一个很好的测试,但是如果你包含一个编程语言标记,你会对你的问题有更好的看法。许多用户只看“他们”的标签集。在Groovy中编写测试时,似乎最了解Unix内部构件的人员是c程序员,因此如果您没有通过使用Groovy进行标记来获得进一步的响应,请将其更改为C(语言)。还有一个标签'unix-programming',当然是合适的。祝你好运! –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值