已合并
VnodeChattr 函数在修改 uid/gid 时没有检查调用者是否具有 CAP_CHOWN 能力,也没有验证调用者是否为文件所有者。 #1434
yang-pangyuan创建于 7月25日
VnodeChattr 函数在修改 uid/gid 时没有检查调用者是否具有 CAP_CHOWN 能力,也没有验证调用者是否为文件所有者。 #1434
已合并
共 1 个文件变更+12-0
| @@ -34,6 +34,7 @@ | |||
| 34 | 34 | ||
| 35 | 35 | ||
| 36 | 36 | ||
| 37 | + | ||
| 37 | 38 | ||
| 38 | LIST_HEAD g_vnodeFreeList; /* free vnodes list */ | 39 | LIST_HEAD g_vnodeFreeList; /* free vnodes list */ |
| 39 | LIST_HEAD g_vnodeVirtualList; /* dev vnodes list */ | 40 | LIST_HEAD g_vnodeVirtualList; /* dev vnodes list */ |
| @@ -661,7 +662,18 @@ static int VnodeChattr(struct Vnode *vnode, struct IATTR *attr) | |||
| 661 | if (vnode == NULL || attr == NULL) { | 662 | if (vnode == NULL || attr == NULL) { |
| 662 | return -EINVAL; | 663 | return -EINVAL; |
| 663 | } | 664 | } |
| 665 | + LosProcessCB *curr = OsCurrProcessGet(); | ||
| 666 | + if (attr->attr_chg_valid & (CHG_UID | CHG_GID)) { | ||
| 667 | + if (!IsCapPermit(CAP_CHOWN) && | ||
| 668 | + (curr->user->userID != vnode->uid)) { | ||
| 669 | + return -EPERM; | ||
| 670 | + } | ||
| 671 | + } | ||
| 664 | if (attr->attr_chg_valid & CHG_MODE) { | 672 | if (attr->attr_chg_valid & CHG_MODE) { |
| 673 | + if (!IsCapPermit(CAP_FOWNER) && | ||
| 674 | + (curr->user->userID != vnode->uid)) { | ||
| 675 | + return -EPERM; | ||
| 676 | + } | ||
| 665 | tmpMode = attr->attr_chg_mode; | 677 | tmpMode = attr->attr_chg_mode; |
| 666 | tmpMode &= ~S_IFMT; | 678 | tmpMode &= ~S_IFMT; |
| 667 | vnode->mode &= S_IFMT; | 679 | vnode->mode &= S_IFMT; |