⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acls.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 4 页
字号:
	printf("get the original sd\n");	q.query_secdesc.level = RAW_FILEINFO_SEC_DESC;	q.query_secdesc.in.file.fnum = fnum;	q.query_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;	status = smb_raw_fileinfo(cli->tree, tctx, &q);	CHECK_STATUS(status, NT_STATUS_OK);	sd_orig = q.query_secdesc.out.sd;	owner_sid = dom_sid_string(tctx, sd_orig->owner_sid);	status = smblsa_sid_check_privilege(cli, 					    owner_sid, 					    sec_privilege_name(SEC_PRIV_RESTORE));	has_restore_privilege = NT_STATUS_IS_OK(status);	if (!NT_STATUS_IS_OK(status)) {		printf("smblsa_sid_check_privilege - %s\n", nt_errstr(status));	}	printf("SEC_PRIV_RESTORE - %s\n", has_restore_privilege?"Yes":"No");	status = smblsa_sid_check_privilege(cli, 					    owner_sid, 					    sec_privilege_name(SEC_PRIV_TAKE_OWNERSHIP));	has_take_ownership_privilege = NT_STATUS_IS_OK(status);	if (!NT_STATUS_IS_OK(status)) {		printf("smblsa_sid_check_privilege - %s\n", nt_errstr(status));	}	printf("SEC_PRIV_TAKE_OWNERSHIP - %s\n", has_take_ownership_privilege?"Yes":"No");	sd = security_descriptor_dacl_create(tctx,					0, NULL, NULL,					owner_sid,					SEC_ACE_TYPE_ACCESS_ALLOWED,					SEC_FILE_WRITE_DATA,					0,					NULL);	set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;	set.set_secdesc.in.file.fnum = fnum;	set.set_secdesc.in.secinfo_flags = SECINFO_DACL;	set.set_secdesc.in.sd = sd;	status = smb_raw_setfileinfo(cli->tree, &set);	CHECK_STATUS(status, NT_STATUS_OK);	expected_bits = SEC_FILE_WRITE_DATA | SEC_FILE_READ_ATTRIBUTE;	for (i=0;i<16;i++) {		uint32_t bit = (1<<i);		io.ntcreatex.in.access_mask = bit;		status = smb_raw_open(cli->tree, tctx, &io);		if (expected_bits & bit) {			if (!NT_STATUS_IS_OK(status)) {				printf("failed with access mask 0x%08x of expected 0x%08x\n",				       bit, expected_bits);			}			CHECK_STATUS(status, NT_STATUS_OK);			CHECK_ACCESS_FLAGS(io.ntcreatex.out.file.fnum, bit | SEC_FILE_READ_ATTRIBUTE);			smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);		} else {			CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);		}	}	printf("put back original sd\n");	set.set_secdesc.in.sd = sd_orig;	status = smb_raw_setfileinfo(cli->tree, &set);	CHECK_STATUS(status, NT_STATUS_OK);done:	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	return ret;}/*  test the inheritance of ACL flags onto new files and directories*/static bool test_inheritance(struct torture_context *tctx, 							 struct smbcli_state *cli){	NTSTATUS status;	union smb_open io;	const char *dname = BASEDIR "\\inheritance";	const char *fname1 = BASEDIR "\\inheritance\\testfile";	const char *fname2 = BASEDIR "\\inheritance\\testdir";	bool ret = true;	int fnum=0, fnum2, i;	union smb_fileinfo q;	union smb_setfileinfo set;	struct security_descriptor *sd, *sd2, *sd_orig=NULL, *sd_def;	const char *owner_sid;	const struct dom_sid *creator_owner;	const struct {		uint32_t parent_flags;		uint32_t file_flags;		uint32_t dir_flags;	} test_flags[] = {		{			0, 			0,			0		},		{			SEC_ACE_FLAG_OBJECT_INHERIT,			0,			SEC_ACE_FLAG_OBJECT_INHERIT | 			SEC_ACE_FLAG_INHERIT_ONLY,		},		{			SEC_ACE_FLAG_CONTAINER_INHERIT,			0,			SEC_ACE_FLAG_CONTAINER_INHERIT,		},		{			SEC_ACE_FLAG_OBJECT_INHERIT | 			SEC_ACE_FLAG_CONTAINER_INHERIT,			0,			SEC_ACE_FLAG_OBJECT_INHERIT | 			SEC_ACE_FLAG_CONTAINER_INHERIT,		},		{			SEC_ACE_FLAG_NO_PROPAGATE_INHERIT,			0,			0,		},		{			SEC_ACE_FLAG_NO_PROPAGATE_INHERIT | 			SEC_ACE_FLAG_OBJECT_INHERIT,			0,			0,		},		{			SEC_ACE_FLAG_NO_PROPAGATE_INHERIT | 			SEC_ACE_FLAG_CONTAINER_INHERIT,			0,			0,		},		{			SEC_ACE_FLAG_NO_PROPAGATE_INHERIT | 			SEC_ACE_FLAG_CONTAINER_INHERIT | 			SEC_ACE_FLAG_OBJECT_INHERIT,			0,			0,		},		{			SEC_ACE_FLAG_INHERIT_ONLY,			0,			0,		},		{			SEC_ACE_FLAG_INHERIT_ONLY | 			SEC_ACE_FLAG_OBJECT_INHERIT,			0,			SEC_ACE_FLAG_OBJECT_INHERIT | 			SEC_ACE_FLAG_INHERIT_ONLY,		},		{			SEC_ACE_FLAG_INHERIT_ONLY | 			SEC_ACE_FLAG_CONTAINER_INHERIT,			0,			SEC_ACE_FLAG_CONTAINER_INHERIT,		},		{			SEC_ACE_FLAG_INHERIT_ONLY | 			SEC_ACE_FLAG_CONTAINER_INHERIT | 			SEC_ACE_FLAG_OBJECT_INHERIT,			0,			SEC_ACE_FLAG_CONTAINER_INHERIT | 			SEC_ACE_FLAG_OBJECT_INHERIT,		},		{			SEC_ACE_FLAG_INHERIT_ONLY | 			SEC_ACE_FLAG_NO_PROPAGATE_INHERIT,			0,			0,		},		{			SEC_ACE_FLAG_INHERIT_ONLY | 			SEC_ACE_FLAG_NO_PROPAGATE_INHERIT | 			SEC_ACE_FLAG_OBJECT_INHERIT,			0,			0,		},		{			SEC_ACE_FLAG_INHERIT_ONLY | 			SEC_ACE_FLAG_NO_PROPAGATE_INHERIT | 			SEC_ACE_FLAG_CONTAINER_INHERIT,			0,			0,		},		{			SEC_ACE_FLAG_INHERIT_ONLY | 			SEC_ACE_FLAG_NO_PROPAGATE_INHERIT | 			SEC_ACE_FLAG_CONTAINER_INHERIT | 			SEC_ACE_FLAG_OBJECT_INHERIT,			0,			0,		}	};	smbcli_rmdir(cli->tree, dname);	printf("TESTING ACL INHERITANCE\n");	io.generic.level = RAW_OPEN_NTCREATEX;	io.ntcreatex.in.root_fid = 0;	io.ntcreatex.in.flags = 0;	io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;	io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY;	io.ntcreatex.in.share_access = 0;	io.ntcreatex.in.alloc_size = 0;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;	io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;	io.ntcreatex.in.security_flags = 0;	io.ntcreatex.in.fname = dname;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ntcreatex.out.file.fnum;	printf("get the original sd\n");	q.query_secdesc.level = RAW_FILEINFO_SEC_DESC;	q.query_secdesc.in.file.fnum = fnum;	q.query_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;	status = smb_raw_fileinfo(cli->tree, tctx, &q);	CHECK_STATUS(status, NT_STATUS_OK);	sd_orig = q.query_secdesc.out.sd;	owner_sid = dom_sid_string(tctx, sd_orig->owner_sid);	printf("owner_sid is %s\n", owner_sid);	sd_def = security_descriptor_dacl_create(tctx,					    0, owner_sid, NULL,					    owner_sid,					    SEC_ACE_TYPE_ACCESS_ALLOWED,					    SEC_RIGHTS_FILE_ALL,					    0,					    SID_NT_SYSTEM,					    SEC_ACE_TYPE_ACCESS_ALLOWED,					    SEC_RIGHTS_FILE_ALL,					    0,					    NULL);	creator_owner = dom_sid_parse_talloc(tctx, SID_CREATOR_OWNER);	for (i=0;i<ARRAY_SIZE(test_flags);i++) {		sd = security_descriptor_dacl_create(tctx,						0, NULL, NULL,						SID_CREATOR_OWNER,						SEC_ACE_TYPE_ACCESS_ALLOWED,						SEC_FILE_WRITE_DATA,						test_flags[i].parent_flags,						SID_WORLD,						SEC_ACE_TYPE_ACCESS_ALLOWED,						SEC_FILE_ALL | SEC_STD_ALL,						0,						NULL);		set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;		set.set_secdesc.in.file.fnum = fnum;		set.set_secdesc.in.secinfo_flags = SECINFO_DACL;		set.set_secdesc.in.sd = sd;		status = smb_raw_setfileinfo(cli->tree, &set);		CHECK_STATUS(status, NT_STATUS_OK);		io.ntcreatex.in.fname = fname1;		io.ntcreatex.in.create_options = 0;		status = smb_raw_open(cli->tree, tctx, &io);		CHECK_STATUS(status, NT_STATUS_OK);		fnum2 = io.ntcreatex.out.file.fnum;		q.query_secdesc.in.file.fnum = fnum2;		status = smb_raw_fileinfo(cli->tree, tctx, &q);		CHECK_STATUS(status, NT_STATUS_OK);		smbcli_close(cli->tree, fnum2);		smbcli_unlink(cli->tree, fname1);		if (!(test_flags[i].parent_flags & SEC_ACE_FLAG_OBJECT_INHERIT)) {			if (!security_descriptor_equal(q.query_secdesc.out.sd, sd_def)) {				printf("Expected default sd at %d - got:\n", i);				NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);			}			goto check_dir;		}		if (q.query_secdesc.out.sd->dacl == NULL ||		    q.query_secdesc.out.sd->dacl->num_aces != 1 ||		    q.query_secdesc.out.sd->dacl->aces[0].access_mask != SEC_FILE_WRITE_DATA ||		    !dom_sid_equal(&q.query_secdesc.out.sd->dacl->aces[0].trustee,				   sd_orig->owner_sid)) {			printf("Bad sd in child file at %d\n", i);			NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);			ret = false;			goto check_dir;		}		if (q.query_secdesc.out.sd->dacl->aces[0].flags != 		    test_flags[i].file_flags) {			printf("incorrect file_flags 0x%x - expected 0x%x for parent 0x%x with (i=%d)\n",			       q.query_secdesc.out.sd->dacl->aces[0].flags,			       test_flags[i].file_flags,			       test_flags[i].parent_flags,			       i);			ret = false;		}	check_dir:		io.ntcreatex.in.fname = fname2;		io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;		status = smb_raw_open(cli->tree, tctx, &io);		CHECK_STATUS(status, NT_STATUS_OK);		fnum2 = io.ntcreatex.out.file.fnum;		q.query_secdesc.in.file.fnum = fnum2;		status = smb_raw_fileinfo(cli->tree, tctx, &q);		CHECK_STATUS(status, NT_STATUS_OK);		smbcli_close(cli->tree, fnum2);		smbcli_rmdir(cli->tree, fname2);		if (!(test_flags[i].parent_flags & SEC_ACE_FLAG_CONTAINER_INHERIT) &&		    (!(test_flags[i].parent_flags & SEC_ACE_FLAG_OBJECT_INHERIT) ||		     (test_flags[i].parent_flags & SEC_ACE_FLAG_NO_PROPAGATE_INHERIT))) {			if (!security_descriptor_equal(q.query_secdesc.out.sd, sd_def)) {				printf("Expected default sd for dir at %d - got:\n", i);				NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);			}			continue;		}		if ((test_flags[i].parent_flags & SEC_ACE_FLAG_CONTAINER_INHERIT) && 		    (test_flags[i].parent_flags & SEC_ACE_FLAG_NO_PROPAGATE_INHERIT)) {			if (q.query_secdesc.out.sd->dacl == NULL ||			    q.query_secdesc.out.sd->dacl->num_aces != 1 ||			    q.query_secdesc.out.sd->dacl->aces[0].access_mask != SEC_FILE_WRITE_DATA ||			    !dom_sid_equal(&q.query_secdesc.out.sd->dacl->aces[0].trustee,					   sd_orig->owner_sid) ||			    q.query_secdesc.out.sd->dacl->aces[0].flags != test_flags[i].dir_flags) {				printf("Bad sd in child dir at %d (parent 0x%x)\n", 				       i, test_flags[i].parent_flags);				NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);				ret = false;				continue;			}		} else if (test_flags[i].parent_flags & SEC_ACE_FLAG_CONTAINER_INHERIT) {			if (q.query_secdesc.out.sd->dacl == NULL ||			    q.query_secdesc.out.sd->dacl->num_aces != 2 ||			    q.query_secdesc.out.sd->dacl->aces[0].access_mask != SEC_FILE_WRITE_DATA ||			    !dom_sid_equal(&q.query_secdesc.out.sd->dacl->aces[0].trustee,					   sd_orig->owner_sid) ||			    q.query_secdesc.out.sd->dacl->aces[1].access_mask != SEC_FILE_WRITE_DATA ||			    !dom_sid_equal(&q.query_secdesc.out.sd->dacl->aces[1].trustee,					   creator_owner) ||			    q.query_secdesc.out.sd->dacl->aces[0].flags != 0 ||			    q.query_secdesc.out.sd->dacl->aces[1].flags != 			    (test_flags[i].dir_flags | SEC_ACE_FLAG_INHERIT_ONLY)) {				printf("Bad sd in child dir at %d (parent 0x%x)\n", 				       i, test_flags[i].parent_flags);				NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);				ret = false;				continue;			}		} else {			if (q.query_secdesc.out.sd->dacl == NULL ||			    q.query_secdesc.out.sd->dacl->num_aces != 1 ||			    q.query_secdesc.out.sd->dacl->aces[0].access_mask != SEC_FILE_WRITE_DATA ||			    !dom_sid_equal(&q.query_secdesc.out.sd->dacl->aces[0].trustee,					   creator_owner) ||			    q.query_secdesc.out.sd->dacl->aces[0].flags != test_flags[i].dir_flags) {				printf("Bad sd in child dir at %d (parent 0x%x)\n", 				       i, test_flags[i].parent_flags);				NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);				ret = false;				continue;			}		}	}	printf("testing access checks on inherited create with %s\n", fname1);	sd = security_descriptor_dacl_create(tctx,					0, NULL, NULL,					owner_sid,					SEC_ACE_TYPE_ACCESS_ALLOWED,					SEC_FILE_WRITE_DATA | SEC_STD_WRITE_DAC,					SEC_ACE_FLAG_OBJECT_INHERIT,					SID_WORLD,					SEC_ACE_TYPE_ACCESS_ALLOWED,					SEC_FILE_ALL | SEC_STD_ALL,					0,					NULL);	set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;	set.set_secdesc.in.file.fnum = fnum;	set.set_secdesc.in.secinfo_flags = SECINFO_DACL;	set.set_secdesc.in.sd = sd;	status = smb_raw_setfileinfo(cli->tree, &set);	CHECK_STATUS(status, NT_STATUS_OK);	io.ntcreatex.in.fname = fname1;	io.ntcreatex.in.create_options = 0;	io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum2 = io.ntcreatex.out.file.fnum;	CHECK_ACCESS_FLAGS(fnum2, SEC_RIGHTS_FILE_ALL);	q.query_secdesc.in.file.fnum = fnum2;	q.query_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;	status = smb_raw_fileinfo(cli->tree, tctx, &q);	CHECK_STATUS(status, NT_STATUS_OK);	smbcli_close(cli->tree, fnum2);	sd2 = security_descriptor_dacl_create(tctx,					 0, owner_sid, NULL,					 owner_sid,					 SEC_ACE_TYPE_ACCESS_ALLOWED,					 SEC_FILE_WRITE_DATA | SEC_STD_WRITE_DAC,					 0,					 NULL);	if (!security_descriptor_equal(q.query_secdesc.out.sd, sd2)) {		printf("%s: security descriptors don't match!\n", __location__);		printf("got:\n");		NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);		printf("expected:\n");		NDR_PRINT_DEBUG(security_descriptor, sd2);		ret = false;	}	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;	io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;	status = smb_raw_open(cli->tree, tctx, &io);	if (NT_STATUS_IS_OK(status)) {		printf("failed: w2k3 ACL bug (allowed open when ACL should deny)\n");		ret = false;		fnum2 = io.ntcreatex.out.file.fnum;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -