1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
| #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/syscall.h> #include <linux/capability.h> #include <errno.h> #include <string.h>
static int capget_wrapper(cap_user_header_t hdrp, cap_user_data_t datap) { return syscall(__NR_capget, hdrp, datap); }
void print_capabilities(const char *label, __u32 caps) { printf("%s: 0x%08x (", label, caps); if (caps == 0) { printf("none"); } else { int first = 1; for (int i = 0; i < 32; i++) { if (caps & (1 << i)) { if (!first) printf(" "); first = 0; switch (i) { case 0: printf("CAP_CHOWN"); break; case 1: printf("CAP_DAC_OVERRIDE"); break; case 2: printf("CAP_DAC_READ_SEARCH"); break; case 3: printf("CAP_FOWNER"); break; case 4: printf("CAP_FSETID"); break; case 5: printf("CAP_KILL"); break; case 6: printf("CAP_SETGID"); break; case 7: printf("CAP_SETUID"); break; case 8: printf("CAP_SETPCAP"); break; case 9: printf("CAP_LINUX_IMMUTABLE"); break; case 10: printf("CAP_NET_BIND_SERVICE"); break; case 11: printf("CAP_NET_BROADCAST"); break; case 12: printf("CAP_NET_ADMIN"); break; case 13: printf("CAP_SYS_MODULE"); break; case 14: printf("CAP_SYS_RAWIO"); break; case 15: printf("CAP_SYS_CHROOT"); break; case 16: printf("CAP_SYS_PTRACE"); break; case 17: printf("CAP_SYS_PACCT"); break; case 18: printf("CAP_SYS_ADMIN"); break; case 19: printf("CAP_SYS_BOOT"); break; case 20: printf("CAP_SYS_NICE"); break; case 21: printf("CAP_SYS_RESOURCE"); break; case 22: printf("CAP_SYS_TIME"); break; case 23: printf("CAP_SYS_TTY_CONFIG"); break; case 24: printf("CAP_MKNOD"); break; case 25: printf("CAP_LEASE"); break; case 26: printf("CAP_AUDIT_WRITE"); break; case 27: printf("CAP_AUDIT_CONTROL"); break; case 28: printf("CAP_SETFCAP"); break; case 29: printf("CAP_MAC_OVERRIDE"); break; case 30: printf("CAP_MAC_ADMIN"); break; case 31: printf("CAP_SYSLOG"); break; default: printf("CAP_%d", i); break; } } } } printf(")\n"); }
int main() { struct __user_cap_header_struct hdr; struct __user_cap_data_struct data[2]; printf("=== Capget 函数示例 ===\n"); printf("当前进程 PID: %d\n", getpid()); printf("当前用户 UID: %d\n", getuid()); printf("当前有效 UID: %d\n", geteuid()); hdr.version = _LINUX_CAPABILITY_VERSION_3; hdr.pid = 0; if (capget_wrapper(&hdr, data) == -1) { perror("capget 失败"); exit(EXIT_FAILURE); } printf("\n进程能力信息:\n"); printf("能力版本: 0x%08x\n", hdr.version); printf("进程 PID: %d\n", hdr.pid); printf("\n能力集详情:\n"); print_capabilities("有效能力 (Effective)", data[0].effective); print_capabilities("允许能力 (Permitted)", data[0].permitted); print_capabilities("可继承能力 (Inheritable)", data[0].inheritable); printf("\n能力状态分析:\n"); if (geteuid() == 0) { printf("✓ 当前进程是 root 用户\n"); if (data[0].effective == 0 && data[0].permitted == 0) { printf(" 但所有能力都被丢弃\n"); } else { printf(" 拥有完整的 root 能力\n"); } } else { printf("✓ 当前进程是非特权用户\n"); if (data[0].effective == 0) { printf(" 没有有效能力\n"); } else { printf(" 拥有一些特定能力\n"); } } printf("\n错误处理演示:\n"); struct __user_cap_header_struct bad_hdr; bad_hdr.version = 0x12345678; bad_hdr.pid = 0; if (capget_wrapper(&bad_hdr, data) == -1) { if (errno == EINVAL) { printf("无效版本号错误处理正确: %s\n", strerror(errno)); } } hdr.version = _LINUX_CAPABILITY_VERSION_3; if (capget_wrapper(&hdr, NULL) == -1) { if (errno == EFAULT) { printf("无效指针错误处理正确: %s\n", strerror(errno)); } } return 0; }
|