免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5266 | 回复: 6
打印 上一主题 下一主题

请教为什么普通用户可以修改root用户的文件? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-30 17:51 |只看该作者 |倒序浏览
发在linux那边没人回,期待这里的大侠指点下,多谢!

普通用户kkk是目录tmp的属主:
[root@open tmp]# ll ../tmp -d
drwxr-xr-x 3 kkk kkk 4096 Jun 30 01:34 ../tmp

root用户创建一个临时文件:
[root@open tmp]# touch tmp2
[root@open tmp]# ll tmp2
-rw-r--r-- 1 root  root   0 Jun 30 01:33 tmp2
[root@open tmp]# stat tmp2
  File: `tmp2'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 555484      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2011-06-30 01:33:44.000000000 -0700
Modify: 2011-06-30 01:33:44.000000000 -0700
Change: 2011-06-30 01:33:44.000000000 -0700

切换到kkk用户:
[root@open tmp]# su - kkk
-sh-3.2$ ll tmp2
-rw-r--r-- 1 root  root   0 Jun 30 01:33 tmp2
使用vi修改,然后:wq!强行写入:
-sh-3.2$ vi tmp2
-sh-3.2$ ll tmp2
-rw-r--r-- 1 kkk kkk  7 Jun 30 01:34 tmp2
tmp2文件的权限变成kkk了!!!
-sh-3.2$ stat tmp2
  File: `tmp2'
  Size: 7               Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 555484      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  100/   kkk)   Gid: (  101/   kkk)
Access: 2011-06-30 01:34:11.000000000 -0700
Modify: 2011-06-30 01:34:11.000000000 -0700
Change: 2011-06-30 01:34:12.000000000 -0700

注1:kkk用户无法对该文件执行chown、touch命令,也无法echo数据重定向到文件里。
注2:kkk用户可以删除该文件,这个是因为kkk有目录的写和执行权限。
请高人指点下,多谢!

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2011-06-30 17:58 |只看该作者
发在linux那边没人回,期待这里的大侠指点下,多谢!

普通用户kkk是目录tmp的属主:
[root@open tmp]#  ...
libran108 发表于 2011-06-30 17:51



注2:kkk用户可以删除该文件,这个是因为kkk有目录的写和执行权限。

使用vi(readonly读取)修改,然后:wq!强行写入就相当于
1. 删档
2. 重新建档(所以属主, ...都会改变,inode应该也改了吧!!!)

论坛徽章:
0
3 [报告]
发表于 2011-06-30 18:33 |只看该作者
回复 2# jason680


    这个用sata命令看,inode没有变化(前后都是555484),这个是比较郁闷的地方,不清楚vi是怎么做到的。。。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2011-06-30 19:24 |只看该作者
我的vim无法实现
你重新来一次,在wq!之前,用strace -p观察一下

论坛徽章:
0
5 [报告]
发表于 2011-06-30 19:32 |只看该作者
路过学习下。

论坛徽章:
0
6 [报告]
发表于 2011-06-30 19:44 |只看该作者
我也试了下,确如楼主的结果。

jason680
说的对,是目录的w权限造成的结果。

论坛徽章:
0
7 [报告]
发表于 2011-06-30 19:44 |只看该作者
本帖最后由 libran108 于 2011-06-30 19:57 编辑

回复 4# cjaizss


# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.0 (Santiago)

# ps -ef | grep -w vim
kkk      10071  9970  0 19:37 pts/0    00:00:00 vim tmp2
root     10073  9997  0 19:37 pts/1    00:00:00 grep -w vim

strace 的输出显示vi使用了unlink删除,但因为此文件还在被vi进程打开,所以kernel不会删除该文件,vi随后写入了修改的内容,这应该是为什么inode没有变化的原因。
多谢cjaizss!!!

# strace -p 10071
Process 10071 attached - interrupt to quit
select(1, [0], NULL, [0], NULL)         = 1 (in [0])
read(0, ":", 250)                       = 1
select(1, [0], NULL, [0], {0, 0})       = 0 (Timeout)
write(1, "\33[?25l\33[49;122H\33[K\33[49;1H:", 26) = 26
ioctl(0, SNDCTL_TMR_START or TCSETS, {B38400 opost -isig -icanon -echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
select(1, [0], NULL, [0], {0, 0})       = 0 (Timeout)
write(1, "\33[?12l\33[?25h", 12)        = 12
select(1, [0], NULL, [0], {4, 0})       = 1 (in [0], left {3, 248919})
select(1, [0], NULL, [0], NULL)         = 1 (in [0])
read(0, "w", 250)                       = 1
select(1, [0], NULL, [0], {0, 0})       = 0 (Timeout)
select(1, [0], NULL, [0], {0, 0})       = 0 (Timeout)
write(1, "w\33[?25l\33[?12l\33[?25h", 19) = 19
select(1, [0], NULL, [0], {4, 0})       = 1 (in [0], left {3, 632294})
select(1, [0], NULL, [0], NULL)         = 1 (in [0])
read(0, "q", 250)                       = 1
select(1, [0], NULL, [0], {0, 0})       = 0 (Timeout)
select(1, [0], NULL, [0], {0, 0})       = 0 (Timeout)
write(1, "q\33[?25l\33[?12l\33[?25h", 19) = 19
select(1, [0], NULL, [0], {4, 0})       = 1 (in [0], left {3, 184105})
select(1, [0], NULL, [0], NULL)         = 1 (in [0])
read(0, "!", 250)                       = 1
select(1, [0], NULL, [0], {0, 0})       = 0 (Timeout)
select(1, [0], NULL, [0], {0, 0})       = 0 (Timeout)
write(1, "!\33[?25l\33[?12l\33[?25h", 19) = 19
select(1, [0], NULL, [0], {4, 0})       = 1 (in [0], left {3, 248979})
select(1, [0], NULL, [0], NULL)         = 1 (in [0])
read(0, "\r", 250)                      = 1
select(1, [0], NULL, [0], {0, 0})       = 0 (Timeout)
write(1, "\r", 1)                       = 1
write(1, "\33[?25l", 6)                 = 6
ioctl(0, SNDCTL_TMR_START or TCSETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
getcwd("/home/kkk/tmp", 4096)           = 14
write(1, "\"tmp2\"", 6)                 = 6
stat("tmp2", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
access("tmp2", W_OK)                    = -1 EACCES (Permission denied)
getxattr("tmp2", "system.posix_acl_access", 0x7fff65ca3770, 132) = -1 ENODATA (No data available)
stat("tmp2", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
lstat("tmp2", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
lstat("4913", 0x7fff65ca3a70)           = -1 ENOENT (No such file or directory)
open("4913", O_WRONLY|O_CREAT|O_EXCL|O_NOFOLLOW, 0100644) = 4
fchown(4, 0, 0)                         = -1 EPERM (Operation not permitted)
stat("4913", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
close(4)                                = 0
unlink("4913"                          = 0
open("tmp2", O_RDONLY)                  = 4
stat("tmp2~", 0x7fff65ca39e0)           = -1 ENOENT (No such file or directory)
unlink("tmp2~"                         = -1 ENOENT (No such file or directory)
open("tmp2~", O_WRONLY|O_CREAT|O_EXCL|O_NOFOLLOW, 0644) = 5
chmod("tmp2~", 0644)                    = 0
getxattr("tmp2", "security.selinux", "unconfined_ubject_r:user_home_t:s0", 255) = 37
getxattr("tmp2~", "security.selinux", "unconfined_ubject_r:user_home_t:s0", 255) = 37
read(4, "", 8192)                       = 0
close(5)                                = 0
utime("tmp2~", [2011/06/30-19:36:13, 2011/06/30-19:35:27]) = 0
setxattr("tmp2~", "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0
getxattr("tmp2", "security.selinux", "unconfined_ubject_r:user_home_t:s0", 255) = 37
getxattr("tmp2~", "security.selinux", "unconfined_ubject_r:user_home_t:s0", 255) = 37
close(4)                                = 0
open("tmp2", O_WRONLY|O_CREAT|O_TRUNC, 0644) = -1 EACCES (Permission denied)
lstat("tmp2", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
getuid()                                = 501
unlink("tmp2"                          = 0
open("tmp2", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "kkkk\n", 5)                   = 5
fsync(4)                                = 0
close(4)                                = 0
chmod("tmp2", 0644)                     = 0
write(1, " 1L, 5C written", 15)         = 15
lseek(3, 0, SEEK_SET)                   = 0
write(3, "b0VIM 7.2\0\0\0\0\20\0\0\177_\fN\253[\10\0W'\0\0kkk\0"..., 4096) = 4096
stat("/home/kkk/tmp/tmp2", {st_mode=S_IFREG|0644, st_size=5, ...}) = 0
unlink("tmp2~"                         = 0
getcwd("/home/kkk/tmp", 4096)           = 14
open("/home/kkk/.viminfo", O_RDONLY)    = 4
stat("/home/kkk/.viminfo", {st_mode=S_IFREG|0600, st_size=600, ...}) = 0
getuid()                                = 501
getuid()                                = 501
stat("/home/kkk/.viminfo.tmp", 0x7fff65ca3d00) = -1 ENOENT (No such file or directory)
umask(0)                                = 02
open("/home/kkk/.viminfo.tmp", O_WRONLY|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = 5
umask(02)                               = 0
fcntl(5, F_GETFL)                       = 0x28001 (flags O_WRONLY|O_LARGEFILE|O_NOFOLLOW)
fstat(5, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc9d42ba000
lseek(5, 0, SEEK_CUR)                   = 0
fchown(5, 501, 501)                     = 0
fstat(4, {st_mode=S_IFREG|0600, st_size=600, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc9d42b9000
read(4, "# This viminfo file was generate"..., 4096) = 600
read(4, "", 4096)                       = 0
write(5, "# This viminfo file was generate"..., 604) = 604
close(5)                                = 0
munmap(0x7fc9d42ba000, 4096)            = 0
close(4)                                = 0
munmap(0x7fc9d42b9000, 4096)            = 0
stat("/home/kkk/.viminfo.tmp", {st_mode=S_IFREG|0600, st_size=604, ...}) = 0
stat("/home/kkk/.viminfo", {st_mode=S_IFREG|0600, st_size=600, ...}) = 0
unlink("/home/kkk/.viminfo"            = 0
rename("/home/kkk/.viminfo.tmp", "/home/kkk/.viminfo" = 0
write(1, "\r\r\n\33[?1l\33>", 10)       = 10
write(1, "\33[?12l\33[?25h\33[?1049l", 20) = 20
close(3)                                = 0
unlink(".tmp2.swp"                     = 0
exit_group(0)                           = ?
Process 10071 detached
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP