已合并
VnodeChattr 函数在修改 uid/gid 时没有检查调用者是否具有 CAP_CHOWN 能力,也没有验证调用者是否为文件所有者。 #1434
yang-pangyuan创建于 7月25日
VnodeChattr 函数在修改 uid/gid 时没有检查调用者是否具有 CAP_CHOWN 能力,也没有验证调用者是否为文件所有者。 #1434
已合并
yang-pangyuan创建于 7月25日
1 个文件变更+12-0
@@ -34,6 +34,7 @@
34#include "vnode.h"34#include "vnode.h"
35#include "los_process.h"35#include "los_process.h"
36#include "los_process_pri.h"36#include "los_process_pri.h"
37+#include "capability_api.h"
37 38 
38LIST_HEAD g_vnodeFreeList; /* free vnodes list */39LIST_HEAD g_vnodeFreeList; /* free vnodes list */
39LIST_HEAD g_vnodeVirtualList; /* dev vnodes list */40LIST_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;