Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Annotation of /trunk/1.6.x/ccs-patch/fs/tomoyo_capability.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1785 - (hide annotations) (download) (as text)
Wed Nov 5 00:00:42 2008 UTC (15 years, 7 months ago) by kumaneko
File MIME type: text/x-csrc
File size: 6945 byte(s)


1 kumaneko 111 /*
2     * fs/tomoyo_capability.c
3     *
4     * Implementation of the Domain-Based Mandatory Access Control.
5     *
6 kumaneko 849 * Copyright (C) 2005-2008 NTT DATA CORPORATION
7 kumaneko 111 *
8 kumaneko 1785 * Version: 1.6.5-rc 2008/11/05
9 kumaneko 111 *
10     * This file is applicable to both 2.4.30 and 2.6.11 and later.
11     * See README.ccs for ChangeLog.
12     *
13     */
14    
15     #include <linux/ccs_common.h>
16     #include <linux/tomoyo.h>
17     #include <linux/realpath.h>
18    
19 kumaneko 1052 /**
20     * cap_operation2name - Convert capability operation to capability message.
21     *
22     * @operation: Type of operation.
23     *
24     * Returns the name of capability.
25     */
26 kumaneko 851 static const char *cap_operation2name(const u8 operation)
27 kumaneko 111 {
28 kumaneko 1015 static const char *capability_name[TOMOYO_MAX_CAPABILITY_INDEX] = {
29 kumaneko 1052 [TOMOYO_INET_STREAM_SOCKET_CREATE] =
30     "socket(PF_INET, SOCK_STREAM)",
31     [TOMOYO_INET_STREAM_SOCKET_LISTEN] =
32     "listen(PF_INET, SOCK_STREAM)",
33     [TOMOYO_INET_STREAM_SOCKET_CONNECT] =
34     "connect(PF_INET, SOCK_STREAM)",
35     [TOMOYO_USE_INET_DGRAM_SOCKET] =
36     "socket(PF_INET, SOCK_DGRAM)",
37     [TOMOYO_USE_INET_RAW_SOCKET] =
38     "socket(PF_INET, SOCK_RAW)",
39 kumaneko 1015 [TOMOYO_USE_ROUTE_SOCKET] = "socket(PF_ROUTE)",
40     [TOMOYO_USE_PACKET_SOCKET] = "socket(PF_PACKET)",
41     [TOMOYO_SYS_MOUNT] = "sys_mount()",
42     [TOMOYO_SYS_UMOUNT] = "sys_umount()",
43     [TOMOYO_SYS_REBOOT] = "sys_reboot()",
44     [TOMOYO_SYS_CHROOT] = "sys_chroot()",
45     [TOMOYO_SYS_KILL] = "sys_kill()",
46     [TOMOYO_SYS_VHANGUP] = "sys_vhangup()",
47     [TOMOYO_SYS_SETTIME] = "sys_settimeofday()",
48     [TOMOYO_SYS_NICE] = "sys_nice()",
49     [TOMOYO_SYS_SETHOSTNAME] = "sys_sethostname()",
50     [TOMOYO_USE_KERNEL_MODULE] = "kernel_module",
51     [TOMOYO_CREATE_FIFO] = "mknod(FIFO)",
52     [TOMOYO_CREATE_BLOCK_DEV] = "mknod(BDEV)",
53     [TOMOYO_CREATE_CHAR_DEV] = "mknod(CDEV)",
54     [TOMOYO_CREATE_UNIX_SOCKET] = "mknod(SOCKET)",
55     [TOMOYO_SYS_LINK] = "sys_link()",
56     [TOMOYO_SYS_SYMLINK] = "sys_symlink()",
57     [TOMOYO_SYS_RENAME] = "sys_rename()",
58     [TOMOYO_SYS_UNLINK] = "sys_unlink()",
59     [TOMOYO_SYS_CHMOD] = "sys_chmod()",
60     [TOMOYO_SYS_CHOWN] = "sys_chown()",
61     [TOMOYO_SYS_IOCTL] = "sys_ioctl()",
62     [TOMOYO_SYS_KEXEC_LOAD] = "sys_kexec_load()",
63     [TOMOYO_SYS_PIVOT_ROOT] = "sys_pivot_root()",
64     [TOMOYO_SYS_PTRACE] = "sys_ptrace()",
65     };
66 kumaneko 1052 if (operation < TOMOYO_MAX_CAPABILITY_INDEX)
67     return capability_name[operation];
68     return NULL;
69 kumaneko 111 }
70    
71 kumaneko 1052 /**
72     * audit_capability_log - Audit capability log.
73     *
74 kumaneko 1657 * @r: Pointer to "struct ccs_request_info".
75 kumaneko 1052 * @operation: Type of operation.
76     * @is_granted: True if this is a granted log.
77     *
78     * Returns 0 on success, negative value otherwise.
79     */
80 kumaneko 1657 static int audit_capability_log(struct ccs_request_info *r, const u8 operation,
81     const bool is_granted)
82 kumaneko 111 {
83 kumaneko 1657 return ccs_write_audit_log(is_granted, r, KEYWORD_ALLOW_CAPABILITY
84     "%s\n", ccs_cap2keyword(operation));
85 kumaneko 111 }
86    
87 kumaneko 1052 /**
88     * update_capability_acl - Update "struct capability_acl_record" list.
89     *
90     * @operation: Type of operation.
91     * @domain: Pointer to "struct domain_info".
92     * @condition: Pointer to "struct condition_list". May be NULL.
93     * @is_delete: True if it is a delete request.
94     *
95     * Returns 0 on success, negative value otherwise.
96     */
97     static int update_capability_acl(const u8 operation, struct domain_info *domain,
98     const struct condition_list *condition,
99     const bool is_delete)
100 kumaneko 111 {
101 kumaneko 1695 static DEFINE_MUTEX(lock);
102 kumaneko 111 struct acl_info *ptr;
103 kumaneko 708 struct capability_acl_record *acl;
104 kumaneko 111 int error = -ENOMEM;
105 kumaneko 1052 if (!domain)
106     return -EINVAL;
107 kumaneko 1695 mutex_lock(&lock);
108 kumaneko 1052 if (is_delete)
109     goto delete;
110     list1_for_each_entry(ptr, &domain->acl_info_list, list) {
111 kumaneko 1064 if (ccs_acl_type1(ptr) != TYPE_CAPABILITY_ACL)
112 kumaneko 1052 continue;
113     if (ccs_get_condition_part(ptr) != condition)
114     continue;
115     acl = container_of(ptr, struct capability_acl_record, head);
116     if (acl->operation != operation)
117     continue;
118     error = ccs_add_domain_acl(NULL, ptr);
119     goto out;
120 kumaneko 111 }
121 kumaneko 1052 /* Not found. Append it to the tail. */
122     acl = ccs_alloc_acl_element(TYPE_CAPABILITY_ACL, condition);
123     if (!acl)
124     goto out;
125     acl->operation = operation;
126     error = ccs_add_domain_acl(domain, &acl->head);
127     goto out;
128     delete:
129     error = -ENOENT;
130     list1_for_each_entry(ptr, &domain->acl_info_list, list) {
131 kumaneko 1064 if (ccs_acl_type2(ptr) != TYPE_CAPABILITY_ACL)
132 kumaneko 1052 continue;
133     if (ccs_get_condition_part(ptr) != condition)
134     continue;
135     acl = container_of(ptr, struct capability_acl_record, head);
136     if (acl->operation != operation)
137     continue;
138     error = ccs_del_domain_acl(ptr);
139     break;
140     }
141     out:
142 kumaneko 1695 mutex_unlock(&lock);
143 kumaneko 111 return error;
144     }
145    
146 kumaneko 1052 /**
147     * ccs_capable - Check permission for capability.
148     *
149     * @operation: Type of operation.
150     *
151 kumaneko 1054 * Returns true on success, false otherwise.
152 kumaneko 1052 */
153 kumaneko 1054 bool ccs_capable(const u8 operation)
154 kumaneko 111 {
155 kumaneko 1657 struct ccs_request_info r;
156 kumaneko 111 struct acl_info *ptr;
157 kumaneko 1657 bool is_enforce;
158 kumaneko 1016 bool found = false;
159 kumaneko 1657 if (!ccs_can_sleep())
160 kumaneko 1054 return true;
161 kumaneko 1657 ccs_init_request_info(&r, NULL, CCS_MAX_CONTROL_INDEX + operation);
162     is_enforce = (r.mode == 3);
163     if (!r.mode)
164     return true;
165 kumaneko 1561 retry:
166 kumaneko 1657 list1_for_each_entry(ptr, &r.domain->acl_info_list, list) {
167 kumaneko 708 struct capability_acl_record *acl;
168 kumaneko 1064 if (ccs_acl_type2(ptr) != TYPE_CAPABILITY_ACL)
169 kumaneko 1052 continue;
170 kumaneko 912 acl = container_of(ptr, struct capability_acl_record, head);
171 kumaneko 1052 if (acl->operation != operation ||
172 kumaneko 1657 !ccs_check_condition(&r, ptr))
173 kumaneko 1052 continue;
174 kumaneko 1782 r.cond = ccs_get_condition_part(ptr);
175 kumaneko 1016 found = true;
176 kumaneko 856 break;
177 kumaneko 111 }
178 kumaneko 1657 audit_capability_log(&r, operation, found);
179 kumaneko 1052 if (found)
180 kumaneko 1054 return true;
181 kumaneko 1657 if (ccs_verbose_mode(r.domain))
182 kumaneko 1052 printk(KERN_WARNING "TOMOYO-%s: %s denied for %s\n",
183     ccs_get_msg(is_enforce), cap_operation2name(operation),
184 kumaneko 1657 ccs_get_last_name(r.domain));
185 kumaneko 1561 if (is_enforce) {
186 kumaneko 1657 int error = ccs_check_supervisor(&r, KEYWORD_ALLOW_CAPABILITY
187 kumaneko 1561 "%s\n",
188     ccs_cap2keyword(operation));
189 kumaneko 1781 if (error == 1)
190 kumaneko 1561 goto retry;
191     return !error;
192     }
193 kumaneko 1657 if (r.mode == 1 && ccs_check_domain_quota(r.domain))
194     update_capability_acl(operation, r.domain, NULL, false);
195 kumaneko 1054 return true;
196 kumaneko 111 }
197 kumaneko 1064 EXPORT_SYMBOL(ccs_capable); /* for net/unix/af_unix.c */
198 kumaneko 111
199 kumaneko 1052 /**
200     * ccs_write_capability_policy - Write "struct capability_acl_record" list.
201     *
202     * @data: String to parse.
203     * @domain: Pointer to "struct domain_info".
204     * @condition: Pointer to "struct condition_list". May be NULL.
205     * @is_delete: True if it is a delete request.
206     *
207     * Returns 0 on success, negative value otherwise.
208     */
209     int ccs_write_capability_policy(char *data, struct domain_info *domain,
210     const struct condition_list *condition,
211     const bool is_delete)
212 kumaneko 111 {
213 kumaneko 851 u8 capability;
214 kumaneko 1052 for (capability = 0; capability < TOMOYO_MAX_CAPABILITY_INDEX;
215     capability++) {
216     if (strcmp(data, ccs_cap2keyword(capability)))
217     continue;
218     return update_capability_acl(capability, domain, condition,
219     is_delete);
220 kumaneko 111 }
221     return -EINVAL;
222     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26