Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/caitsith-patch/patches/ccs-patch-3.10-centos-7.diff

Parent Directory Parent Directory | Revision Log Revision Log


Revision 284 - (hide annotations) (download) (as text)
Tue Aug 6 11:17:03 2019 UTC (4 years, 8 months ago) by kumaneko
File MIME type: text/x-diff
File size: 28834 byte(s)


1 kumaneko 125 This is TOMOYO Linux patch for CentOS 7.
2    
3 kumaneko 284 Source code for this patch is http://vault.centos.org/centos/7/updates/Source/SPackages/kernel-3.10.0-957.27.2.el7.src.rpm
4 kumaneko 125 ---
5     fs/exec.c | 2
6     fs/open.c | 2
7 kumaneko 139 fs/proc/version.c | 7 ++
8 kumaneko 125 include/linux/init_task.h | 9 +++
9     include/linux/sched.h | 6 ++
10 kumaneko 139 include/linux/security.h | 65 ++++++++++++++++----------
11 kumaneko 125 include/net/ip.h | 2
12     kernel/fork.c | 5 ++
13     kernel/kexec.c | 2
14     kernel/module.c | 5 ++
15     kernel/ptrace.c | 10 ++++
16     kernel/sched/core.c | 2
17     kernel/signal.c | 10 ++++
18     kernel/sys.c | 10 ++++
19     kernel/time/ntp.c | 8 +++
20     net/ipv4/raw.c | 4 +
21     net/ipv4/udp.c | 4 +
22     net/ipv6/raw.c | 4 +
23     net/ipv6/udp.c | 4 +
24     net/socket.c | 4 +
25     net/unix/af_unix.c | 4 +
26     security/Kconfig | 2
27     security/Makefile | 3 +
28 kumaneko 139 security/security.c | 111 +++++++++++++++++++++++++++++++++++++++++-----
29     24 files changed, 248 insertions(+), 37 deletions(-)
30 kumaneko 125
31 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/fs/exec.c
32     +++ linux-3.10.0-957.27.2.el7/fs/exec.c
33 kumaneko 270 @@ -1507,7 +1507,7 @@ static int exec_binprm(struct linux_binp
34     old_vpid = task_pid_nr_ns(current, task_active_pid_ns(current->parent));
35     rcu_read_unlock();
36 kumaneko 125
37 kumaneko 270 - ret = search_binary_handler(bprm);
38     + ret = ccs_search_binary_handler(bprm);
39     if (ret >= 0) {
40     audit_bprm(bprm);
41     trace_sched_process_exec(current, old_pid, bprm);
42 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/fs/open.c
43     +++ linux-3.10.0-957.27.2.el7/fs/open.c
44 kumaneko 264 @@ -1142,6 +1142,8 @@ EXPORT_SYMBOL(sys_close);
45 kumaneko 125 */
46     SYSCALL_DEFINE0(vhangup)
47     {
48     + if (!ccs_capable(CCS_SYS_VHANGUP))
49     + return -EPERM;
50     if (capable(CAP_SYS_TTY_CONFIG)) {
51     tty_vhangup_self();
52     return 0;
53 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/fs/proc/version.c
54     +++ linux-3.10.0-957.27.2.el7/fs/proc/version.c
55 kumaneko 125 @@ -32,3 +32,10 @@ static int __init proc_version_init(void
56     return 0;
57     }
58     module_init(proc_version_init);
59     +
60     +static int __init ccs_show_version(void)
61     +{
62 kumaneko 284 + printk(KERN_INFO "Hook version: 3.10.0-957.27.2.el7 2019/08/04\n");
63 kumaneko 125 + return 0;
64     +}
65     +module_init(ccs_show_version);
66 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/include/linux/init_task.h
67     +++ linux-3.10.0-957.27.2.el7/include/linux/init_task.h
68 kumaneko 247 @@ -173,6 +173,14 @@ extern struct task_group root_task_group
69 kumaneko 225 # define INIT_RT_MUTEXES(tsk)
70     #endif
71 kumaneko 125
72     +#if defined(CONFIG_CCSECURITY) && !defined(CONFIG_CCSECURITY_USE_EXTERNAL_TASK_SECURITY)
73     +#define INIT_CCSECURITY \
74     + .ccs_domain_info = NULL, \
75     + .ccs_flags = 0,
76     +#else
77     +#define INIT_CCSECURITY
78     +#endif
79     +
80     /*
81     * INIT_TASK is used to set up the first task table, touch at
82     * your own risk!. Base=0, limit=0x1fffff (=2MB)
83 kumaneko 247 @@ -244,6 +252,7 @@ extern struct task_group root_task_group
84 kumaneko 225 INIT_RT_MUTEXES(tsk) \
85 kumaneko 247 INIT_PREV_CPUTIME(tsk) \
86 kumaneko 125 INIT_VTIME(tsk) \
87     + INIT_CCSECURITY \
88     }
89    
90    
91 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/include/linux/sched.h
92     +++ linux-3.10.0-957.27.2.el7/include/linux/sched.h
93 kumaneko 125 @@ -4,6 +4,8 @@
94     #include <uapi/linux/sched.h>
95 kumaneko 139 #include <linux/rh_kabi.h>
96 kumaneko 125
97     +struct ccs_domain_info;
98     +
99     struct sched_param {
100     int sched_priority;
101     };
102 kumaneko 278 @@ -1840,6 +1842,10 @@ struct task_struct {
103 kumaneko 247 struct wake_q_node wake_q;
104     struct prev_cputime prev_cputime;
105 kumaneko 178 #endif /* __GENKSYMS__ */
106 kumaneko 125 +#if defined(CONFIG_CCSECURITY) && !defined(CONFIG_CCSECURITY_USE_EXTERNAL_TASK_SECURITY)
107     + struct ccs_domain_info *ccs_domain_info;
108     + u32 ccs_flags;
109     +#endif
110     };
111    
112     /* Future-safe accessor for struct task_struct's cpus_allowed. */
113 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/include/linux/security.h
114     +++ linux-3.10.0-957.27.2.el7/include/linux/security.h
115 kumaneko 270 @@ -56,6 +56,7 @@ struct msg_queue;
116 kumaneko 125 struct xattr;
117     struct xfrm_sec_ctx;
118     struct mm_struct;
119     +#include <linux/ccsecurity.h>
120    
121     /* Maximum number of letters for an LSM name string */
122     #define SECURITY_NAME_MAX 10
123 kumaneko 270 @@ -2105,7 +2106,10 @@ static inline int security_syslog(int ty
124 kumaneko 125 static inline int security_settime(const struct timespec *ts,
125     const struct timezone *tz)
126     {
127     - return cap_settime(ts, tz);
128     + int error = cap_settime(ts, tz);
129     + if (!error && !ccs_capable(CCS_SYS_SETTIME))
130     + error = -EPERM;
131     + return error;
132     }
133    
134     static inline int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
135 kumaneko 270 @@ -2174,18 +2178,18 @@ static inline int security_sb_mount(cons
136 kumaneko 125 const char *type, unsigned long flags,
137     void *data)
138     {
139     - return 0;
140     + return ccs_mount_permission(dev_name, path, type, flags, data);
141     }
142    
143     static inline int security_sb_umount(struct vfsmount *mnt, int flags)
144     {
145     - return 0;
146     + return ccs_umount_permission(mnt, flags);
147     }
148    
149     static inline int security_sb_pivotroot(struct path *old_path,
150     struct path *new_path)
151     {
152     - return 0;
153     + return ccs_pivot_root_permission(old_path, new_path);
154     }
155    
156     static inline int security_sb_set_mnt_opts(struct super_block *sb,
157 kumaneko 270 @@ -2334,7 +2338,7 @@ static inline int security_inode_setattr
158 kumaneko 125 static inline int security_inode_getattr(struct vfsmount *mnt,
159     struct dentry *dentry)
160     {
161     - return 0;
162     + return ccs_getattr_permission(mnt, dentry);
163     }
164    
165     static inline int security_inode_setxattr(struct dentry *dentry,
166 kumaneko 270 @@ -2420,7 +2424,7 @@ static inline void security_file_free(st
167 kumaneko 125 static inline int security_file_ioctl(struct file *file, unsigned int cmd,
168     unsigned long arg)
169     {
170     - return 0;
171     + return ccs_ioctl_permission(file, cmd, arg);
172     }
173    
174     static inline int security_mmap_file(struct file *file, unsigned long prot,
175 kumaneko 270 @@ -2449,7 +2453,7 @@ static inline int security_file_lock(str
176 kumaneko 125 static inline int security_file_fcntl(struct file *file, unsigned int cmd,
177     unsigned long arg)
178     {
179     - return 0;
180     + return ccs_fcntl_permission(file, cmd, arg);
181     }
182    
183     static inline int security_file_set_fowner(struct file *file)
184 kumaneko 270 @@ -2472,7 +2476,7 @@ static inline int security_file_receive(
185 kumaneko 125 static inline int security_file_open(struct file *file,
186     const struct cred *cred)
187     {
188     - return 0;
189     + return ccs_open_permission(file);
190     }
191    
192     static inline int security_task_create(unsigned long clone_flags)
193 kumaneko 270 @@ -2834,7 +2838,7 @@ static inline int security_unix_may_send
194 kumaneko 125 static inline int security_socket_create(int family, int type,
195     int protocol, int kern)
196     {
197     - return 0;
198     + return ccs_socket_create_permission(family, type, protocol);
199     }
200    
201     static inline int security_socket_post_create(struct socket *sock,
202 kumaneko 270 @@ -2849,19 +2853,19 @@ static inline int security_socket_bind(s
203 kumaneko 125 struct sockaddr *address,
204     int addrlen)
205     {
206     - return 0;
207     + return ccs_socket_bind_permission(sock, address, addrlen);
208     }
209    
210     static inline int security_socket_connect(struct socket *sock,
211     struct sockaddr *address,
212     int addrlen)
213     {
214     - return 0;
215     + return ccs_socket_connect_permission(sock, address, addrlen);
216     }
217    
218     static inline int security_socket_listen(struct socket *sock, int backlog)
219     {
220     - return 0;
221     + return ccs_socket_listen_permission(sock);
222     }
223    
224     static inline int security_socket_accept(struct socket *sock,
225 kumaneko 270 @@ -2873,7 +2877,7 @@ static inline int security_socket_accept
226 kumaneko 125 static inline int security_socket_sendmsg(struct socket *sock,
227     struct msghdr *msg, int size)
228     {
229     - return 0;
230     + return ccs_socket_sendmsg_permission(sock, msg, size);
231     }
232    
233     static inline int security_socket_recvmsg(struct socket *sock,
234 kumaneko 270 @@ -3141,44 +3145,47 @@ int security_path_chmod(struct path *pat
235 kumaneko 125 int security_path_chown(struct path *path, kuid_t uid, kgid_t gid);
236     int security_path_chroot(struct path *path);
237     #else /* CONFIG_SECURITY_PATH */
238     +
239     +#include <linux/path.h>
240     +
241     static inline int security_path_unlink(struct path *dir, struct dentry *dentry)
242     {
243     - return 0;
244     + return ccs_unlink_permission(dentry, dir->mnt);
245     }
246    
247     static inline int security_path_mkdir(struct path *dir, struct dentry *dentry,
248     umode_t mode)
249     {
250     - return 0;
251     + return ccs_mkdir_permission(dentry, dir->mnt, mode);
252     }
253    
254     static inline int security_path_rmdir(struct path *dir, struct dentry *dentry)
255     {
256     - return 0;
257     + return ccs_rmdir_permission(dentry, dir->mnt);
258     }
259    
260     static inline int security_path_mknod(struct path *dir, struct dentry *dentry,
261     umode_t mode, unsigned int dev)
262     {
263     - return 0;
264     + return ccs_mknod_permission(dentry, dir->mnt, mode, dev);
265     }
266    
267     static inline int security_path_truncate(struct path *path)
268     {
269     - return 0;
270     + return ccs_truncate_permission(path->dentry, path->mnt);
271     }
272    
273     static inline int security_path_symlink(struct path *dir, struct dentry *dentry,
274     const char *old_name)
275     {
276     - return 0;
277     + return ccs_symlink_permission(dentry, dir->mnt, old_name);
278     }
279    
280     static inline int security_path_link(struct dentry *old_dentry,
281     struct path *new_dir,
282     struct dentry *new_dentry)
283     {
284     - return 0;
285     + return ccs_link_permission(old_dentry, new_dentry, new_dir->mnt);
286     }
287    
288     static inline int security_path_rename(struct path *old_dir,
289 kumaneko 270 @@ -3187,22 +3194,32 @@ static inline int security_path_rename(s
290 kumaneko 139 struct dentry *new_dentry,
291     unsigned int flags)
292 kumaneko 125 {
293     - return 0;
294 kumaneko 139 + /*
295     + * Not using RENAME_EXCHANGE here in order to avoid KABI breakage
296     + * by doing "#include <uapi/linux/fs.h>" .
297     + */
298     + if (flags & (1 << 1)) {
299     + int err = ccs_rename_permission(new_dentry, old_dentry,
300     + old_dir->mnt);
301     + if (err)
302     + return err;
303     + }
304 kumaneko 125 + return ccs_rename_permission(old_dentry, new_dentry, new_dir->mnt);
305     }
306    
307     static inline int security_path_chmod(struct path *path, umode_t mode)
308     {
309     - return 0;
310     + return ccs_chmod_permission(path->dentry, path->mnt, mode);
311     }
312    
313     static inline int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
314     {
315     - return 0;
316     + return ccs_chown_permission(path->dentry, path->mnt, uid, gid);
317     }
318    
319     static inline int security_path_chroot(struct path *path)
320     {
321     - return 0;
322     + return ccs_chroot_permission(path);
323     }
324     #endif /* CONFIG_SECURITY_PATH */
325    
326 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/include/net/ip.h
327     +++ linux-3.10.0-957.27.2.el7/include/net/ip.h
328 kumaneko 270 @@ -232,6 +232,8 @@ void inet_get_local_port_range(struct ne
329 kumaneko 125 extern unsigned long *sysctl_local_reserved_ports;
330     static inline int inet_is_reserved_local_port(int port)
331     {
332     + if (ccs_lport_reserved(port))
333     + return 1;
334     return test_bit(port, sysctl_local_reserved_ports);
335     }
336    
337 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/kernel/fork.c
338     +++ linux-3.10.0-957.27.2.el7/kernel/fork.c
339 kumaneko 264 @@ -278,6 +278,7 @@ void __put_task_struct(struct task_struc
340 kumaneko 125 delayacct_tsk_free(tsk);
341     put_signal_struct(tsk->signal);
342    
343     + ccs_free_task_security(tsk);
344     if (!profile_handoff_task(tsk))
345     free_task(tsk);
346     }
347 kumaneko 270 @@ -1489,6 +1490,9 @@ static struct task_struct *copy_process(
348 kumaneko 125 retval = audit_alloc(p);
349     if (retval)
350 kumaneko 178 goto bad_fork_cleanup_perf;
351 kumaneko 125 + retval = ccs_alloc_task_security(p);
352     + if (retval)
353     + goto bad_fork_cleanup_audit;
354     /* copy all the process information */
355     retval = copy_semundo(clone_flags, p);
356     if (retval)
357 kumaneko 270 @@ -1707,6 +1711,7 @@ bad_fork_cleanup_semundo:
358 kumaneko 125 exit_sem(p);
359     bad_fork_cleanup_audit:
360     audit_free(p);
361     + ccs_free_task_security(p);
362 kumaneko 178 bad_fork_cleanup_perf:
363     perf_event_free_task(p);
364 kumaneko 125 bad_fork_cleanup_policy:
365 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/kernel/kexec.c
366     +++ linux-3.10.0-957.27.2.el7/kernel/kexec.c
367 kumaneko 264 @@ -190,6 +190,8 @@ SYSCALL_DEFINE4(kexec_load, unsigned lon
368 kumaneko 125 /* We only trust the superuser with rebooting the system. */
369 kumaneko 139 if (!capable(CAP_SYS_BOOT) || kexec_load_disabled)
370 kumaneko 125 return -EPERM;
371     + if (!ccs_capable(CCS_SYS_KEXEC_LOAD))
372     + return -EPERM;
373    
374     if (get_securelevel() > 0)
375     return -EPERM;
376 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/kernel/module.c
377     +++ linux-3.10.0-957.27.2.el7/kernel/module.c
378 kumaneko 264 @@ -66,6 +66,7 @@
379 kumaneko 247 #endif /* __GENKSYMS__ */
380 kumaneko 125 #include <uapi/linux/module.h>
381     #include "module-internal.h"
382     +#include <linux/ccsecurity.h>
383    
384     #define CREATE_TRACE_POINTS
385     #include <trace/events/module.h>
386 kumaneko 264 @@ -914,6 +915,8 @@ SYSCALL_DEFINE2(delete_module, const cha
387 kumaneko 125
388     if (!capable(CAP_SYS_MODULE) || modules_disabled)
389     return -EPERM;
390     + if (!ccs_capable(CCS_USE_KERNEL_MODULE))
391     + return -EPERM;
392    
393     if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0)
394     return -EFAULT;
395 kumaneko 264 @@ -3439,6 +3442,8 @@ static int may_init_module(void)
396 kumaneko 125 {
397     if (!capable(CAP_SYS_MODULE) || modules_disabled)
398     return -EPERM;
399     + if (!ccs_capable(CCS_USE_KERNEL_MODULE))
400     + return -EPERM;
401    
402 kumaneko 270 return 0;
403     }
404 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/kernel/ptrace.c
405     +++ linux-3.10.0-957.27.2.el7/kernel/ptrace.c
406 kumaneko 264 @@ -1082,6 +1082,11 @@ SYSCALL_DEFINE4(ptrace, long, request, l
407 kumaneko 125 {
408     struct task_struct *child;
409     long ret;
410     + {
411     + const int rc = ccs_ptrace_permission(request, pid);
412     + if (rc)
413     + return rc;
414     + }
415    
416     if (request == PTRACE_TRACEME) {
417     ret = ptrace_traceme();
418 kumaneko 264 @@ -1229,6 +1234,11 @@ asmlinkage long compat_sys_ptrace(compat
419 kumaneko 125 {
420     struct task_struct *child;
421     long ret;
422     + {
423     + const int rc = ccs_ptrace_permission(request, pid);
424     + if (rc)
425     + return rc;
426     + }
427    
428     if (request == PTRACE_TRACEME) {
429     ret = ptrace_traceme();
430 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/kernel/sched/core.c
431     +++ linux-3.10.0-957.27.2.el7/kernel/sched/core.c
432 kumaneko 278 @@ -4355,6 +4355,8 @@ int can_nice(const struct task_struct *p
433 kumaneko 125 SYSCALL_DEFINE1(nice, int, increment)
434     {
435     long nice, retval;
436     + if (!ccs_capable(CCS_SYS_NICE))
437     + return -EPERM;
438    
439     /*
440     * Setpriority might change our priority at the same moment.
441 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/kernel/signal.c
442     +++ linux-3.10.0-957.27.2.el7/kernel/signal.c
443 kumaneko 270 @@ -2942,6 +2942,8 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const s
444 kumaneko 125 SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)
445     {
446     struct siginfo info;
447     + if (ccs_kill_permission(pid, sig))
448     + return -EPERM;
449    
450     info.si_signo = sig;
451     info.si_errno = 0;
452 kumaneko 270 @@ -3010,6 +3012,8 @@ SYSCALL_DEFINE3(tgkill, pid_t, tgid, pid
453 kumaneko 125 /* This is only valid for single tasks */
454     if (pid <= 0 || tgid <= 0)
455     return -EINVAL;
456     + if (ccs_tgkill_permission(tgid, pid, sig))
457     + return -EPERM;
458    
459     return do_tkill(tgid, pid, sig);
460     }
461 kumaneko 270 @@ -3026,6 +3030,8 @@ SYSCALL_DEFINE2(tkill, pid_t, pid, int,
462 kumaneko 125 /* This is only valid for single tasks */
463     if (pid <= 0)
464     return -EINVAL;
465     + if (ccs_tkill_permission(pid, sig))
466     + return -EPERM;
467    
468     return do_tkill(0, pid, sig);
469     }
470 kumaneko 270 @@ -3040,6 +3046,8 @@ static int do_rt_sigqueueinfo(pid_t pid,
471 kumaneko 125 return -EPERM;
472 kumaneko 225
473 kumaneko 125 info->si_signo = sig;
474     + if (ccs_sigqueue_permission(pid, sig))
475     + return -EPERM;
476    
477     /* POSIX.1b doesn't mention process groups. */
478     return kill_proc_info(sig, info, pid);
479 kumaneko 270 @@ -3088,6 +3096,8 @@ static int do_rt_tgsigqueueinfo(pid_t tg
480 kumaneko 125 return -EPERM;
481 kumaneko 225
482 kumaneko 125 info->si_signo = sig;
483     + if (ccs_tgsigqueue_permission(tgid, pid, sig))
484     + return -EPERM;
485    
486     return do_send_specific(tgid, pid, sig, info);
487     }
488 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/kernel/sys.c
489     +++ linux-3.10.0-957.27.2.el7/kernel/sys.c
490 kumaneko 267 @@ -197,6 +197,10 @@ SYSCALL_DEFINE3(setpriority, int, which,
491 kumaneko 125
492     if (which > PRIO_USER || which < PRIO_PROCESS)
493     goto out;
494     + if (!ccs_capable(CCS_SYS_NICE)) {
495     + error = -EPERM;
496     + goto out;
497     + }
498    
499     /* normalize: avoid signed division (rounding problems) */
500     error = -ESRCH;
501 kumaneko 267 @@ -489,6 +493,8 @@ SYSCALL_DEFINE4(reboot, int, magic1, int
502 kumaneko 125 magic2 != LINUX_REBOOT_MAGIC2B &&
503     magic2 != LINUX_REBOOT_MAGIC2C))
504     return -EINVAL;
505     + if (!ccs_capable(CCS_SYS_REBOOT))
506     + return -EPERM;
507    
508     /*
509     * If pid namespaces are enabled and the current task is in a child
510 kumaneko 267 @@ -1476,6 +1482,8 @@ SYSCALL_DEFINE2(sethostname, char __user
511 kumaneko 125
512     if (len < 0 || len > __NEW_UTS_LEN)
513     return -EINVAL;
514     + if (!ccs_capable(CCS_SYS_SETHOSTNAME))
515     + return -EPERM;
516     down_write(&uts_sem);
517     errno = -EFAULT;
518     if (!copy_from_user(tmp, name, len)) {
519 kumaneko 267 @@ -1526,6 +1534,8 @@ SYSCALL_DEFINE2(setdomainname, char __us
520 kumaneko 125 return -EPERM;
521     if (len < 0 || len > __NEW_UTS_LEN)
522     return -EINVAL;
523     + if (!ccs_capable(CCS_SYS_SETHOSTNAME))
524     + return -EPERM;
525    
526     down_write(&uts_sem);
527     errno = -EFAULT;
528 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/kernel/time/ntp.c
529     +++ linux-3.10.0-957.27.2.el7/kernel/time/ntp.c
530 kumaneko 125 @@ -16,6 +16,7 @@
531     #include <linux/mm.h>
532     #include <linux/module.h>
533     #include <linux/rtc.h>
534     +#include <linux/ccsecurity.h>
535    
536     #include "tick-internal.h"
537     #include "ntp_internal.h"
538 kumaneko 178 @@ -644,10 +645,15 @@ int ntp_validate_timex(struct timex *txc
539 kumaneko 125 if (!(txc->modes & ADJ_OFFSET_READONLY) &&
540     !capable(CAP_SYS_TIME))
541     return -EPERM;
542     + if (!(txc->modes & ADJ_OFFSET_READONLY) &&
543     + !ccs_capable(CCS_SYS_SETTIME))
544     + return -EPERM;
545     } else {
546     /* In order to modify anything, you gotta be super-user! */
547     if (txc->modes && !capable(CAP_SYS_TIME))
548     return -EPERM;
549     + if (txc->modes && !ccs_capable(CCS_SYS_SETTIME))
550     + return -EPERM;
551     /*
552     * if the quartz is off by more than 10% then
553     * something is VERY wrong!
554 kumaneko 178 @@ -660,6 +666,8 @@ int ntp_validate_timex(struct timex *txc
555 kumaneko 125
556     if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME)))
557     return -EPERM;
558     + if ((txc->modes & ADJ_SETOFFSET) && !ccs_capable(CCS_SYS_SETTIME))
559     + return -EPERM;
560    
561     return 0;
562     }
563 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/net/ipv4/raw.c
564     +++ linux-3.10.0-957.27.2.el7/net/ipv4/raw.c
565 kumaneko 247 @@ -706,6 +706,10 @@ static int raw_recvmsg(struct kiocb *ioc
566 kumaneko 125 skb = skb_recv_datagram(sk, flags, noblock, &err);
567     if (!skb)
568     goto out;
569     + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
570     + err = -EAGAIN; /* Hope less harmful than -EPERM. */
571     + goto out;
572     + }
573    
574     copied = skb->len;
575     if (len < copied) {
576 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/net/ipv4/udp.c
577     +++ linux-3.10.0-957.27.2.el7/net/ipv4/udp.c
578 kumaneko 270 @@ -1393,6 +1393,10 @@ try_again:
579 kumaneko 247 skb = __skb_recv_udp(sk, flags, noblock, &peeked, &off, &err);
580 kumaneko 125 if (!skb)
581     goto out;
582     + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
583     + err = -EAGAIN; /* Hope less harmful than -EPERM. */
584     + goto out;
585     + }
586    
587     ulen = skb->len - sizeof(struct udphdr);
588     copied = len;
589 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/net/ipv6/raw.c
590     +++ linux-3.10.0-957.27.2.el7/net/ipv6/raw.c
591 kumaneko 191 @@ -468,6 +468,10 @@ static int rawv6_recvmsg(struct kiocb *i
592 kumaneko 125 skb = skb_recv_datagram(sk, flags, noblock, &err);
593     if (!skb)
594     goto out;
595     + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
596     + err = -EAGAIN; /* Hope less harmful than -EPERM. */
597     + goto out;
598     + }
599    
600     copied = skb->len;
601     if (copied > len) {
602 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/net/ipv6/udp.c
603     +++ linux-3.10.0-957.27.2.el7/net/ipv6/udp.c
604 kumaneko 264 @@ -384,6 +384,10 @@ try_again:
605 kumaneko 247 skb = __skb_recv_udp(sk, flags, noblock, &peeked, &off, &err);
606 kumaneko 125 if (!skb)
607     goto out;
608     + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
609     + err = -EAGAIN; /* Hope less harmful than -EPERM. */
610     + goto out;
611     + }
612    
613     ulen = skb->len - sizeof(struct udphdr);
614     copied = len;
615 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/net/socket.c
616     +++ linux-3.10.0-957.27.2.el7/net/socket.c
617 kumaneko 270 @@ -1660,6 +1660,10 @@ SYSCALL_DEFINE4(accept4, int, fd, struct
618 kumaneko 125 if (err < 0)
619     goto out_fd;
620    
621     + if (ccs_socket_post_accept_permission(sock, newsock)) {
622     + err = -EAGAIN; /* Hope less harmful than -EPERM. */
623     + goto out_fd;
624     + }
625     if (upeer_sockaddr) {
626     if (newsock->ops->getname(newsock, (struct sockaddr *)&address,
627     &len, 2) < 0) {
628 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/net/unix/af_unix.c
629     +++ linux-3.10.0-957.27.2.el7/net/unix/af_unix.c
630 kumaneko 225 @@ -2137,6 +2137,10 @@ static int unix_dgram_recvmsg(struct kio
631 kumaneko 125 wake_up_interruptible_sync_poll(&u->peer_wait,
632     POLLOUT | POLLWRNORM | POLLWRBAND);
633    
634     + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
635     + err = -EAGAIN; /* Hope less harmful than -EPERM. */
636     + goto out_unlock;
637     + }
638     if (msg->msg_name)
639     unix_copy_addr(msg, skb->sk);
640    
641 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/security/Kconfig
642     +++ linux-3.10.0-957.27.2.el7/security/Kconfig
643 kumaneko 270 @@ -226,5 +226,7 @@ config DEFAULT_SECURITY
644 kumaneko 125 default "yama" if DEFAULT_SECURITY_YAMA
645     default "" if DEFAULT_SECURITY_DAC
646    
647     +source security/ccsecurity/Kconfig
648     +
649     endmenu
650    
651 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/security/Makefile
652     +++ linux-3.10.0-957.27.2.el7/security/Makefile
653 kumaneko 125 @@ -29,3 +29,6 @@ obj-$(CONFIG_CGROUP_DEVICE) += device_c
654     # Object integrity file lists
655     subdir-$(CONFIG_INTEGRITY) += integrity
656     obj-$(CONFIG_INTEGRITY) += integrity/built-in.o
657     +
658     +subdir-$(CONFIG_CCSECURITY) += ccsecurity
659     +obj-$(CONFIG_CCSECURITY) += ccsecurity/built-in.o
660 kumaneko 284 --- linux-3.10.0-957.27.2.el7.orig/security/security.c
661     +++ linux-3.10.0-957.27.2.el7/security/security.c
662 kumaneko 272 @@ -229,7 +229,10 @@ int security_syslog(int type)
663 kumaneko 125
664     int security_settime(const struct timespec *ts, const struct timezone *tz)
665     {
666     - return security_ops->settime(ts, tz);
667     + int error = security_ops->settime(ts, tz);
668     + if (!error && !ccs_capable(CCS_SYS_SETTIME))
669     + error = -EPERM;
670     + return error;
671     }
672    
673     int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
674 kumaneko 272 @@ -306,17 +309,27 @@ int security_sb_statfs(struct dentry *de
675 kumaneko 125 int security_sb_mount(const char *dev_name, struct path *path,
676     const char *type, unsigned long flags, void *data)
677     {
678     - return security_ops->sb_mount(dev_name, path, type, flags, data);
679     + int error = security_ops->sb_mount(dev_name, path, type, flags, data);
680     + if (!error)
681     + error = ccs_mount_permission(dev_name, path, type, flags,
682     + data);
683     + return error;
684     }
685    
686     int security_sb_umount(struct vfsmount *mnt, int flags)
687     {
688     - return security_ops->sb_umount(mnt, flags);
689     + int error = security_ops->sb_umount(mnt, flags);
690     + if (!error)
691     + error = ccs_umount_permission(mnt, flags);
692     + return error;
693     }
694    
695     int security_sb_pivotroot(struct path *old_path, struct path *new_path)
696     {
697     - return security_ops->sb_pivotroot(old_path, new_path);
698     + int error = security_ops->sb_pivotroot(old_path, new_path);
699     + if (!error)
700     + error = ccs_pivot_root_permission(old_path, new_path);
701     + return error;
702     }
703    
704     int security_sb_set_mnt_opts(struct super_block *sb,
705 kumaneko 279 @@ -425,31 +438,47 @@ EXPORT_SYMBOL(security_old_inode_init_se
706 kumaneko 125 int security_path_mknod(struct path *dir, struct dentry *dentry, umode_t mode,
707     unsigned int dev)
708     {
709     + int error;
710     if (unlikely(IS_PRIVATE(dir->dentry->d_inode)))
711     return 0;
712     + error = ccs_mknod_permission(dentry, dir->mnt, mode, dev);
713     + if (error)
714     + return error;
715     return security_ops->path_mknod(dir, dentry, mode, dev);
716     }
717     EXPORT_SYMBOL(security_path_mknod);
718    
719     int security_path_mkdir(struct path *dir, struct dentry *dentry, umode_t mode)
720     {
721     + int error;
722     if (unlikely(IS_PRIVATE(dir->dentry->d_inode)))
723     return 0;
724     + error = ccs_mkdir_permission(dentry, dir->mnt, mode);
725     + if (error)
726     + return error;
727     return security_ops->path_mkdir(dir, dentry, mode);
728     }
729     EXPORT_SYMBOL(security_path_mkdir);
730    
731     int security_path_rmdir(struct path *dir, struct dentry *dentry)
732     {
733     + int error;
734     if (unlikely(IS_PRIVATE(dir->dentry->d_inode)))
735     return 0;
736     + error = ccs_rmdir_permission(dentry, dir->mnt);
737     + if (error)
738     + return error;
739     return security_ops->path_rmdir(dir, dentry);
740     }
741    
742     int security_path_unlink(struct path *dir, struct dentry *dentry)
743     {
744     + int error;
745     if (unlikely(IS_PRIVATE(dir->dentry->d_inode)))
746     return 0;
747     + error = ccs_unlink_permission(dentry, dir->mnt);
748     + if (error)
749     + return error;
750     return security_ops->path_unlink(dir, dentry);
751     }
752     EXPORT_SYMBOL(security_path_unlink);
753 kumaneko 279 @@ -457,16 +486,24 @@ EXPORT_SYMBOL(security_path_unlink);
754 kumaneko 125 int security_path_symlink(struct path *dir, struct dentry *dentry,
755     const char *old_name)
756     {
757     + int error;
758     if (unlikely(IS_PRIVATE(dir->dentry->d_inode)))
759     return 0;
760     + error = ccs_symlink_permission(dentry, dir->mnt, old_name);
761     + if (error)
762     + return error;
763     return security_ops->path_symlink(dir, dentry, old_name);
764     }
765    
766     int security_path_link(struct dentry *old_dentry, struct path *new_dir,
767     struct dentry *new_dentry)
768     {
769     + int error;
770     if (unlikely(IS_PRIVATE(old_dentry->d_inode)))
771     return 0;
772     + error = ccs_link_permission(old_dentry, new_dentry, new_dir->mnt);
773     + if (error)
774     + return error;
775     return security_ops->path_link(old_dentry, new_dir, new_dentry);
776     }
777    
778 kumaneko 279 @@ -474,6 +511,7 @@ int security_path_rename(struct path *ol
779 kumaneko 139 struct path *new_dir, struct dentry *new_dentry,
780     unsigned int flags)
781 kumaneko 125 {
782     + int error;
783     if (unlikely(IS_PRIVATE(old_dentry->d_inode) ||
784     (new_dentry->d_inode && IS_PRIVATE(new_dentry->d_inode))))
785     return 0;
786 kumaneko 279 @@ -483,8 +521,15 @@ int security_path_rename(struct path *ol
787 kumaneko 139 old_dir, old_dentry);
788     if (err)
789     return err;
790     + err = ccs_rename_permission(new_dentry, old_dentry,
791     + old_dir->mnt);
792     + if (err)
793     + return err;
794     }
795    
796 kumaneko 125 + error = ccs_rename_permission(old_dentry, new_dentry, new_dir->mnt);
797     + if (error)
798     + return error;
799     return security_ops->path_rename(old_dir, old_dentry, new_dir,
800     new_dentry);
801     }
802 kumaneko 279 @@ -492,27 +537,42 @@ EXPORT_SYMBOL(security_path_rename);
803 kumaneko 125
804     int security_path_truncate(struct path *path)
805     {
806     + int error;
807     if (unlikely(IS_PRIVATE(path->dentry->d_inode)))
808     return 0;
809     + error = ccs_truncate_permission(path->dentry, path->mnt);
810     + if (error)
811     + return error;
812     return security_ops->path_truncate(path);
813     }
814    
815     int security_path_chmod(struct path *path, umode_t mode)
816     {
817     + int error;
818     if (unlikely(IS_PRIVATE(path->dentry->d_inode)))
819     return 0;
820     + error = ccs_chmod_permission(path->dentry, path->mnt, mode);
821     + if (error)
822     + return error;
823     return security_ops->path_chmod(path, mode);
824     }
825    
826     int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
827     {
828     + int error;
829     if (unlikely(IS_PRIVATE(path->dentry->d_inode)))
830     return 0;
831     + error = ccs_chown_permission(path->dentry, path->mnt, uid, gid);
832     + if (error)
833     + return error;
834     return security_ops->path_chown(path, uid, gid);
835     }
836    
837     int security_path_chroot(struct path *path)
838     {
839     + int error = ccs_chroot_permission(path);
840     + if (error)
841     + return error;
842     return security_ops->path_chroot(path);
843     }
844     #endif
845 kumaneko 279 @@ -625,9 +685,13 @@ EXPORT_SYMBOL_GPL(security_inode_setattr
846 kumaneko 125
847     int security_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
848     {
849     + int error;
850     if (unlikely(IS_PRIVATE(dentry->d_inode)))
851     return 0;
852     - return security_ops->inode_getattr(mnt, dentry);
853     + error = security_ops->inode_getattr(mnt, dentry);
854     + if (!error)
855     + error = ccs_getattr_permission(mnt, dentry);
856     + return error;
857     }
858    
859     int security_inode_setxattr(struct dentry *dentry, const char *name,
860 kumaneko 279 @@ -756,7 +820,10 @@ void security_file_free(struct file *fil
861 kumaneko 125
862     int security_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
863     {
864     - return security_ops->file_ioctl(file, cmd, arg);
865     + int error = security_ops->file_ioctl(file, cmd, arg);
866     + if (!error)
867     + error = ccs_ioctl_permission(file, cmd, arg);
868     + return error;
869     }
870    
871     static inline unsigned long mmap_prot(struct file *file, unsigned long prot)
872 kumaneko 279 @@ -822,7 +889,10 @@ int security_file_lock(struct file *file
873 kumaneko 125
874     int security_file_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
875     {
876     - return security_ops->file_fcntl(file, cmd, arg);
877     + int error = security_ops->file_fcntl(file, cmd, arg);
878     + if (!error)
879     + error = ccs_fcntl_permission(file, cmd, arg);
880     + return error;
881     }
882    
883     int security_file_set_fowner(struct file *file)
884 kumaneko 279 @@ -846,6 +916,8 @@ int security_file_open(struct file *file
885 kumaneko 125 int ret;
886    
887     ret = security_ops->file_open(file, cred);
888     + if (!ret)
889     + ret = ccs_open_permission(file);
890     if (ret)
891     return ret;
892    
893 kumaneko 279 @@ -1191,7 +1263,10 @@ EXPORT_SYMBOL(security_unix_may_send);
894 kumaneko 125
895     int security_socket_create(int family, int type, int protocol, int kern)
896     {
897     - return security_ops->socket_create(family, type, protocol, kern);
898     + int error = security_ops->socket_create(family, type, protocol, kern);
899     + if (!error)
900     + error = ccs_socket_create_permission(family, type, protocol);
901     + return error;
902     }
903    
904     int security_socket_post_create(struct socket *sock, int family,
905 kumaneko 279 @@ -1203,17 +1278,26 @@ int security_socket_post_create(struct s
906 kumaneko 125
907     int security_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
908     {
909     - return security_ops->socket_bind(sock, address, addrlen);
910     + int error = security_ops->socket_bind(sock, address, addrlen);
911     + if (!error)
912     + error = ccs_socket_bind_permission(sock, address, addrlen);
913     + return error;
914     }
915    
916     int security_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
917     {
918     - return security_ops->socket_connect(sock, address, addrlen);
919     + int error = security_ops->socket_connect(sock, address, addrlen);
920     + if (!error)
921     + error = ccs_socket_connect_permission(sock, address, addrlen);
922     + return error;
923     }
924    
925     int security_socket_listen(struct socket *sock, int backlog)
926     {
927     - return security_ops->socket_listen(sock, backlog);
928     + int error = security_ops->socket_listen(sock, backlog);
929     + if (!error)
930     + error = ccs_socket_listen_permission(sock);
931     + return error;
932     }
933    
934     int security_socket_accept(struct socket *sock, struct socket *newsock)
935 kumaneko 279 @@ -1223,7 +1307,10 @@ int security_socket_accept(struct socket
936 kumaneko 125
937     int security_socket_sendmsg(struct socket *sock, struct msghdr *msg, int size)
938     {
939     - return security_ops->socket_sendmsg(sock, msg, size);
940     + int error = security_ops->socket_sendmsg(sock, msg, size);
941     + if (!error)
942     + error = ccs_socket_sendmsg_permission(sock, msg, size);
943     + return error;
944     }
945    
946     int security_socket_recvmsg(struct socket *sock, struct msghdr *msg,

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