blob: df1c05f88f9abb3a724b84bd79f6351cad3e190f [file] [log] [blame]
# Copyright 2017 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
include <linux/xattr.h>
include <linux/uuid.h>
include <uapi/linux/posix_acl_xattr.h>
include <uapi/linux/posix_acl.h>
include <uapi/linux/capability.h>
include <security/integrity/integrity.h>
include <fs/overlayfs/overlayfs.h>
include <uapi/linux/hash_info.h>
setxattr(path ptr[in, filename], name ptr[in, xattr_name], val ptr[in, string], size len[val], flags flags[setxattr_flags])
lsetxattr(path ptr[in, filename], name ptr[in, xattr_name], val ptr[in, string], size len[val], flags flags[setxattr_flags])
fsetxattr(fd fd, name ptr[in, xattr_name], val ptr[in, string], size len[val], flags flags[setxattr_flags])
getxattr(path ptr[in, filename], name ptr[in, xattr_name], val buffer[out], size len[val])
lgetxattr(path ptr[in, filename], name ptr[in, xattr_name], val buffer[out], size len[val])
fgetxattr(fd fd, name ptr[in, xattr_name], val buffer[out], size len[val])
listxattr(path ptr[in, filename], list buffer[out], size len[list])
llistxattr(path ptr[in, filename], list buffer[out], size len[list])
flistxattr(fd fd, list buffer[out], size len[list])
removexattr(path ptr[in, filename], name ptr[in, xattr_name])
lremovexattr(path ptr[in, filename], name ptr[in, xattr_name])
fremovexattr(fd fd, name ptr[in, xattr_name])
xattr_name [
known string[xattr_names]
random xattr_name_random
] [varlen]
xattr_name_random {
prefix stringnoz[xattr_prefix]
name string
} [packed]
setxattr_flags = XATTR_CREATE, XATTR_REPLACE
xattr_prefix = "system.", "trusted.", "security.", "user.", "btrfs.", "osx.", "os2."
xattr_names = "system.posix_acl_access", "system.posix_acl_default", "system.advise", "system.sockprotoname", "com.apple.FinderInfo", "com.apple.system.Security", "user.syz", "trusted.syz", "security.apparmor", "trusted.overlay.opaque", "trusted.overlay.redirect", "trusted.overlay.origin", "trusted.overlay.impure", "trusted.overlay.nlink", "trusted.overlay.upper", "trusted.overlay.metacopy"
setxattr$system_posix_acl(path ptr[in, filename], name ptr[in, string[xattr_posix_acl_names]], val ptr[in, xattr_system_posix_acl_access], size len[val], flags flags[setxattr_flags])
lsetxattr$system_posix_acl(path ptr[in, filename], name ptr[in, string[xattr_posix_acl_names]], val ptr[in, xattr_system_posix_acl_access], size len[val], flags flags[setxattr_flags])
fsetxattr$system_posix_acl(fd fd, name ptr[in, string[xattr_posix_acl_names]], val ptr[in, xattr_system_posix_acl_access], size len[val], flags flags[setxattr_flags])
xattr_posix_acl_names = "system.posix_acl_access", "system.posix_acl_default"
xattr_system_posix_acl_access {
header posix_acl_xattr_header
user_obj posix_acl_xattr_entry[ACL_USER_OBJ, const[0, int32]]
users array[posix_acl_xattr_entry[ACL_USER, uid]]
group_obj posix_acl_xattr_entry[ACL_GROUP_OBJ, const[0, int32]]
groups array[posix_acl_xattr_entry[ACL_GROUP, gid]]
mask posix_acl_xattr_entry[ACL_MASK, const[0, int32]]
other posix_acl_xattr_entry[ACL_OTHER, const[0, int32]]
} [packed]
posix_acl_xattr_header {
a_version const[POSIX_ACL_XATTR_VERSION, int32]
}
type posix_acl_xattr_entry[TAG, ID] {
e_tag const[TAG, int16]
e_perm flags[posix_acl_perm, int16]
e_id ID
}
posix_acl_perm = ACL_READ, ACL_WRITE, ACL_EXECUTE
setxattr$security_capability(path ptr[in, filename], name ptr[in, string["security.capability"]], val ptr[in, vfs_cap_data_u], size len[val], flags flags[setxattr_flags])
lsetxattr$security_capability(path ptr[in, filename], name ptr[in, string["security.capability"]], val ptr[in, vfs_cap_data_u], size len[val], flags flags[setxattr_flags])
fsetxattr$security_capability(fd fd, name ptr[in, string["security.capability"]], val ptr[in, vfs_cap_data_u], size len[val], flags flags[setxattr_flags])
vfs_cap_data_u [
v1 vfs_cap_data_v1
v2 vfs_cap_data
v3 vfs_ns_cap_data
] [varlen]
vfs_cap_data_v1 {
magic_etc const[VFS_CAP_REVISION_1, int32]
data array[vfs_cap_elem, VFS_CAP_U32_1]
}
vfs_cap_data {
magic_etc const[VFS_CAP_REVISION_2, int32]
data array[vfs_cap_elem, VFS_CAP_U32_2]
}
vfs_ns_cap_data {
magic_etc const[VFS_CAP_REVISION_3, int32]
data array[vfs_cap_elem, VFS_CAP_U32_3]
rootid uid
}
vfs_cap_elem {
permitted int32
inheritable int32
}
setxattr$security_evm(path ptr[in, filename], name ptr[in, string["security.evm"]], val ptr[in, evm_ima_xattr], size len[val], flags flags[setxattr_flags])
lsetxattr$security_evm(path ptr[in, filename], name ptr[in, string["security.evm"]], val ptr[in, evm_ima_xattr], size len[val], flags flags[setxattr_flags])
fsetxattr$security_evm(fd fd, name ptr[in, string["security.evm"]], val ptr[in, evm_ima_xattr], size len[val], flags flags[setxattr_flags])
setxattr$security_ima(path ptr[in, filename], name ptr[in, string["security.ima"]], val ptr[in, evm_ima_xattr], size len[val], flags flags[setxattr_flags])
lsetxattr$security_ima(path ptr[in, filename], name ptr[in, string["security.ima"]], val ptr[in, evm_ima_xattr], size len[val], flags flags[setxattr_flags])
fsetxattr$security_ima(fd fd, name ptr[in, string["security.ima"]], val ptr[in, evm_ima_xattr], size len[val], flags flags[setxattr_flags])
evm_ima_xattr [
v1 evm_ima_xattr_data
v2 signature_v2_hdr
md5 evm_ima_xattr_digest_md5
sha1 evm_ima_xattr_digest_sha1
ng evm_ima_xattr_digest_ng
] [varlen]
evm_ima_xattr_data {
type const[EVM_XATTR_HMAC, int8]
digest array[int8, 0:SHA1_DIGEST_SIZE]
}
signature_v2_hdr {
type flags[evm_xattr_type, int8]
version int8[0:3]
hash_algo int8[0:HASH_ALGO__LAST]
keyid int32be
sig_size bytesize[sig, int16be]
sig array[int8]
}
evm_xattr_type = EVM_IMA_XATTR_DIGSIG, EVM_XATTR_PORTABLE_DIGSIG
evm_ima_xattr_digest_md5 {
type const[IMA_XATTR_DIGEST, int8]
digest array[int8, 16]
}
evm_ima_xattr_digest_sha1 {
type const[IMA_XATTR_DIGEST, int8]
digest array[int8, 20]
}
evm_ima_xattr_digest_ng {
type const[IMA_XATTR_DIGEST_NG, int8]
algo int8[0:HASH_ALGO__LAST]
digest array[int8, 0:SHA1_DIGEST_SIZE]
}
setxattr$trusted_overlay_origin(path ptr[in, filename], name ptr[in, string["trusted.overlay.origin"]], val ptr[in, string["y"]], size len[val], flags flags[setxattr_flags])
lsetxattr$trusted_overlay_origin(path ptr[in, filename], name ptr[in, string["trusted.overlay.origin"]], val ptr[in, string["y"]], size len[val], flags flags[setxattr_flags])
fsetxattr$trusted_overlay_origin(fd fd, name ptr[in, string["trusted.overlay.origin"]], val ptr[in, string["y"]], size len[val], flags flags[setxattr_flags])
setxattr$trusted_overlay_opaque(path ptr[in, filename], name ptr[in, string["trusted.overlay.opaque"]], val ptr[in, string["y"]], size len[val], flags flags[setxattr_flags])
lsetxattr$trusted_overlay_opaque(path ptr[in, filename], name ptr[in, string["trusted.overlay.opaque"]], val ptr[in, string["y"]], size len[val], flags flags[setxattr_flags])
fsetxattr$trusted_overlay_opaque(fd fd, name ptr[in, string["trusted.overlay.opaque"]], val ptr[in, string["y"]], size len[val], flags flags[setxattr_flags])
setxattr$trusted_overlay_redirect(path ptr[in, filename], name ptr[in, string["trusted.overlay.redirect"]], val ptr[in, filename], size len[val], flags flags[setxattr_flags])
lsetxattr$trusted_overlay_redirect(path ptr[in, filename], name ptr[in, string["trusted.overlay.redirect"]], val ptr[in, filename], size len[val], flags flags[setxattr_flags])
fsetxattr$trusted_overlay_redirect(fd fd, name ptr[in, string["trusted.overlay.redirect"]], val ptr[in, filename], size len[val], flags flags[setxattr_flags])
setxattr$trusted_overlay_nlink(path ptr[in, filename], name ptr[in, string["trusted.overlay.nlink"]], val ptr[in, xattr_overlay_nlink], size len[val], flags flags[setxattr_flags])
lsetxattr$trusted_overlay_nlink(path ptr[in, filename], name ptr[in, string["trusted.overlay.nlink"]], val ptr[in, xattr_overlay_nlink], size len[val], flags flags[setxattr_flags])
fsetxattr$trusted_overlay_nlink(fd fd, name ptr[in, string["trusted.overlay.nlink"]], val ptr[in, xattr_overlay_nlink], size len[val], flags flags[setxattr_flags])
setxattr$trusted_overlay_upper(path ptr[in, filename], name ptr[in, string["trusted.overlay.upper"]], val ptr[in, ovl_fh], size len[val], flags flags[setxattr_flags])
lsetxattr$trusted_overlay_upper(path ptr[in, filename], name ptr[in, string["trusted.overlay.upper"]], val ptr[in, ovl_fh], size len[val], flags flags[setxattr_flags])
fsetxattr$trusted_overlay_upper(fd fd, name ptr[in, string["trusted.overlay.upper"]], val ptr[in, ovl_fh], size len[val], flags flags[setxattr_flags])
xattr_overlay_nlink {
prefix stringnoz[xattr_overlay_nlink_prefix]
num fmt[dec, int64]
}
xattr_overlay_nlink_prefix = "U+", "U-", "L+", "L-"
ovl_fh {
version const[0, int8]
magic const[OVL_FH_MAGIC, int8]
len bytesize[parent, int8]
flags flags[ovl_fh_flags, int8]
type int8
uuid uuid_t
fid array[int8]
} [packed]
type uuid_t array[int8, UUID_SIZE]
ovl_fh_flags = OVL_FH_FLAG_BIG_ENDIAN, OVL_FH_FLAG_ANY_ENDIAN, OVL_FH_FLAG_PATH_UPPER