Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/caitsith-patch/patches/ccs-patch-4.17.diff

Parent Directory Parent Directory | Revision Log Revision Log


Revision 267 - (show annotations) (download) (as text)
Mon Aug 27 10:15:55 2018 UTC (5 years, 7 months ago) by kumaneko
File MIME type: text/x-diff
File size: 19734 byte(s)


1 This is TOMOYO Linux patch for kernel 4.17.19.
2
3 Source code for this patch is https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.17.19.tar.xz
4 ---
5 fs/exec.c | 2 -
6 fs/open.c | 2 +
7 fs/proc/version.c | 7 ++++
8 include/linux/sched.h | 5 +++
9 include/linux/security.h | 68 ++++++++++++++++++++++++++++------------------
10 include/net/ip.h | 4 ++
11 init/init_task.c | 4 ++
12 kernel/kexec.c | 4 ++
13 kernel/module.c | 5 +++
14 kernel/ptrace.c | 10 ++++++
15 kernel/reboot.c | 3 ++
16 kernel/sched/core.c | 2 +
17 kernel/signal.c | 10 ++++++
18 kernel/sys.c | 8 +++++
19 kernel/time/timekeeping.c | 8 +++++
20 net/ipv4/raw.c | 4 ++
21 net/ipv4/udp.c | 2 +
22 net/ipv6/raw.c | 4 ++
23 net/ipv6/udp.c | 2 +
24 net/socket.c | 4 ++
25 net/unix/af_unix.c | 5 +++
26 security/Kconfig | 2 +
27 security/Makefile | 3 ++
28 security/security.c | 9 +++++-
29 24 files changed, 148 insertions(+), 29 deletions(-)
30
31 --- linux-4.17.19.orig/fs/exec.c
32 +++ linux-4.17.19/fs/exec.c
33 @@ -1690,7 +1690,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
37 - 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 --- linux-4.17.19.orig/fs/open.c
43 +++ linux-4.17.19/fs/open.c
44 @@ -1212,6 +1212,8 @@ SYSCALL_DEFINE1(close, unsigned int, fd)
45 */
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 --- linux-4.17.19.orig/fs/proc/version.c
54 +++ linux-4.17.19/fs/proc/version.c
55 @@ -33,3 +33,10 @@ static int __init proc_version_init(void
56 return 0;
57 }
58 fs_initcall(proc_version_init);
59 +
60 +static int __init ccs_show_version(void)
61 +{
62 + printk(KERN_INFO "Hook version: 4.17.19 2018/08/25\n");
63 + return 0;
64 +}
65 +fs_initcall(ccs_show_version);
66 --- linux-4.17.19.orig/include/linux/sched.h
67 +++ linux-4.17.19/include/linux/sched.h
68 @@ -33,6 +33,7 @@ struct audit_context;
69 struct backing_dev_info;
70 struct bio_list;
71 struct blk_plug;
72 +struct ccs_domain_info;
73 struct cfs_rq;
74 struct fs_struct;
75 struct futex_pi_state;
76 @@ -1167,6 +1168,10 @@ struct task_struct {
77 /* Used by LSM modules for access restriction: */
78 void *security;
79 #endif
80 +#if defined(CONFIG_CCSECURITY) && !defined(CONFIG_CCSECURITY_USE_EXTERNAL_TASK_SECURITY)
81 + struct ccs_domain_info *ccs_domain_info;
82 + u32 ccs_flags;
83 +#endif
84
85 /*
86 * New fields for task_struct should be added above here, so that
87 --- linux-4.17.19.orig/include/linux/security.h
88 +++ linux-4.17.19/include/linux/security.h
89 @@ -53,6 +53,7 @@ struct msg_msg;
90 struct xattr;
91 struct xfrm_sec_ctx;
92 struct mm_struct;
93 +#include <linux/ccsecurity.h>
94
95 /* If capable should audit the security request */
96 #define SECURITY_CAP_NOAUDIT 0
97 @@ -505,7 +506,10 @@ static inline int security_syslog(int ty
98 static inline int security_settime64(const struct timespec64 *ts,
99 const struct timezone *tz)
100 {
101 - return cap_settime(ts, tz);
102 + int error = cap_settime(ts, tz);
103 + if (!error)
104 + error = ccs_settime(ts, tz);
105 + return error;
106 }
107
108 static inline int security_settime(const struct timespec *ts,
109 @@ -577,18 +581,18 @@ static inline int security_sb_mount(cons
110 const char *type, unsigned long flags,
111 void *data)
112 {
113 - return 0;
114 + return ccs_sb_mount(dev_name, path, type, flags, data);
115 }
116
117 static inline int security_sb_umount(struct vfsmount *mnt, int flags)
118 {
119 - return 0;
120 + return ccs_sb_umount(mnt, flags);
121 }
122
123 static inline int security_sb_pivotroot(const struct path *old_path,
124 const struct path *new_path)
125 {
126 - return 0;
127 + return ccs_sb_pivotroot(old_path, new_path);
128 }
129
130 static inline int security_sb_set_mnt_opts(struct super_block *sb,
131 @@ -737,7 +741,7 @@ static inline int security_inode_setattr
132
133 static inline int security_inode_getattr(const struct path *path)
134 {
135 - return 0;
136 + return ccs_inode_getattr(path);
137 }
138
139 static inline int security_inode_setxattr(struct dentry *dentry,
140 @@ -823,7 +827,7 @@ static inline void security_file_free(st
141 static inline int security_file_ioctl(struct file *file, unsigned int cmd,
142 unsigned long arg)
143 {
144 - return 0;
145 + return ccs_file_ioctl(file, cmd, arg);
146 }
147
148 static inline int security_mmap_file(struct file *file, unsigned long prot,
149 @@ -852,7 +856,7 @@ static inline int security_file_lock(str
150 static inline int security_file_fcntl(struct file *file, unsigned int cmd,
151 unsigned long arg)
152 {
153 - return 0;
154 + return ccs_file_fcntl(file, cmd, arg);
155 }
156
157 static inline void security_file_set_fowner(struct file *file)
158 @@ -875,17 +879,19 @@ static inline int security_file_receive(
159 static inline int security_file_open(struct file *file,
160 const struct cred *cred)
161 {
162 - return 0;
163 + return ccs_file_open(file, cred);
164 }
165
166 static inline int security_task_alloc(struct task_struct *task,
167 unsigned long clone_flags)
168 {
169 - return 0;
170 + return ccs_alloc_task_security(task);
171 }
172
173 static inline void security_task_free(struct task_struct *task)
174 -{ }
175 +{
176 + ccs_free_task_security(task);
177 +}
178
179 static inline int security_cred_alloc_blank(struct cred *cred, gfp_t gfp)
180 {
181 @@ -1251,7 +1257,7 @@ static inline int security_unix_may_send
182 static inline int security_socket_create(int family, int type,
183 int protocol, int kern)
184 {
185 - return 0;
186 + return ccs_socket_create(family, type, protocol, kern);
187 }
188
189 static inline int security_socket_post_create(struct socket *sock,
190 @@ -1266,19 +1272,19 @@ static inline int security_socket_bind(s
191 struct sockaddr *address,
192 int addrlen)
193 {
194 - return 0;
195 + return ccs_socket_bind(sock, address, addrlen);
196 }
197
198 static inline int security_socket_connect(struct socket *sock,
199 struct sockaddr *address,
200 int addrlen)
201 {
202 - return 0;
203 + return ccs_socket_connect(sock, address, addrlen);
204 }
205
206 static inline int security_socket_listen(struct socket *sock, int backlog)
207 {
208 - return 0;
209 + return ccs_socket_listen(sock, backlog);
210 }
211
212 static inline int security_socket_accept(struct socket *sock,
213 @@ -1290,7 +1296,7 @@ static inline int security_socket_accept
214 static inline int security_socket_sendmsg(struct socket *sock,
215 struct msghdr *msg, int size)
216 {
217 - return 0;
218 + return ccs_socket_sendmsg(sock, msg, size);
219 }
220
221 static inline int security_socket_recvmsg(struct socket *sock,
222 @@ -1577,42 +1583,42 @@ int security_path_chroot(const struct pa
223 #else /* CONFIG_SECURITY_PATH */
224 static inline int security_path_unlink(const struct path *dir, struct dentry *dentry)
225 {
226 - return 0;
227 + return ccs_path_unlink(dir, dentry);
228 }
229
230 static inline int security_path_mkdir(const struct path *dir, struct dentry *dentry,
231 umode_t mode)
232 {
233 - return 0;
234 + return ccs_path_mkdir(dir, dentry, mode);
235 }
236
237 static inline int security_path_rmdir(const struct path *dir, struct dentry *dentry)
238 {
239 - return 0;
240 + return ccs_path_rmdir(dir, dentry);
241 }
242
243 static inline int security_path_mknod(const struct path *dir, struct dentry *dentry,
244 umode_t mode, unsigned int dev)
245 {
246 - return 0;
247 + return ccs_path_mknod(dir, dentry, mode, dev);
248 }
249
250 static inline int security_path_truncate(const struct path *path)
251 {
252 - return 0;
253 + return ccs_path_truncate(path);
254 }
255
256 static inline int security_path_symlink(const struct path *dir, struct dentry *dentry,
257 const char *old_name)
258 {
259 - return 0;
260 + return ccs_path_symlink(dir, dentry, old_name);
261 }
262
263 static inline int security_path_link(struct dentry *old_dentry,
264 const struct path *new_dir,
265 struct dentry *new_dentry)
266 {
267 - return 0;
268 + return ccs_path_link(old_dentry, new_dir, new_dentry);
269 }
270
271 static inline int security_path_rename(const struct path *old_dir,
272 @@ -1621,22 +1627,32 @@ static inline int security_path_rename(c
273 struct dentry *new_dentry,
274 unsigned int flags)
275 {
276 - return 0;
277 + /*
278 + * Not using RENAME_EXCHANGE here in order to avoid KABI breakage
279 + * by doing "#include <uapi/linux/fs.h>" .
280 + */
281 + if (flags & (1 << 1)) {
282 + int err = ccs_path_rename(new_dir, new_dentry, old_dir,
283 + old_dentry);
284 + if (err)
285 + return err;
286 + }
287 + return ccs_path_rename(old_dir, old_dentry, new_dir, new_dentry);
288 }
289
290 static inline int security_path_chmod(const struct path *path, umode_t mode)
291 {
292 - return 0;
293 + return ccs_path_chmod(path, mode);
294 }
295
296 static inline int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
297 {
298 - return 0;
299 + return ccs_path_chown(path, uid, gid);
300 }
301
302 static inline int security_path_chroot(const struct path *path)
303 {
304 - return 0;
305 + return ccs_path_chroot(path);
306 }
307 #endif /* CONFIG_SECURITY_PATH */
308
309 --- linux-4.17.19.orig/include/net/ip.h
310 +++ linux-4.17.19/include/net/ip.h
311 @@ -277,6 +277,8 @@ void inet_get_local_port_range(struct ne
312 #ifdef CONFIG_SYSCTL
313 static inline int inet_is_local_reserved_port(struct net *net, int port)
314 {
315 + if (ccs_lport_reserved(port))
316 + return 1;
317 if (!net->ipv4.sysctl_local_reserved_ports)
318 return 0;
319 return test_bit(port, net->ipv4.sysctl_local_reserved_ports);
320 @@ -295,6 +297,8 @@ static inline int inet_prot_sock(struct
321 #else
322 static inline int inet_is_local_reserved_port(struct net *net, int port)
323 {
324 + if (ccs_lport_reserved(port))
325 + return 1;
326 return 0;
327 }
328
329 --- linux-4.17.19.orig/init/init_task.c
330 +++ linux-4.17.19/init/init_task.c
331 @@ -175,6 +175,10 @@ struct task_struct init_task
332 #ifdef CONFIG_SECURITY
333 .security = NULL,
334 #endif
335 +#if defined(CONFIG_CCSECURITY) && !defined(CONFIG_CCSECURITY_USE_EXTERNAL_TASK_SECURITY)
336 + .ccs_domain_info = NULL,
337 + .ccs_flags = 0,
338 +#endif
339 };
340 EXPORT_SYMBOL(init_task);
341
342 --- linux-4.17.19.orig/kernel/kexec.c
343 +++ linux-4.17.19/kernel/kexec.c
344 @@ -17,7 +17,7 @@
345 #include <linux/syscalls.h>
346 #include <linux/vmalloc.h>
347 #include <linux/slab.h>
348 -
349 +#include <linux/ccsecurity.h>
350 #include "kexec_internal.h"
351
352 static int copy_user_segment_list(struct kimage *image,
353 @@ -198,6 +198,8 @@ static inline int kexec_load_check(unsig
354 /* We only trust the superuser with rebooting the system. */
355 if (!capable(CAP_SYS_BOOT) || kexec_load_disabled)
356 return -EPERM;
357 + if (!ccs_capable(CCS_SYS_KEXEC_LOAD))
358 + return -EPERM;
359
360 /*
361 * Verify we have a legal set of flags
362 --- linux-4.17.19.orig/kernel/module.c
363 +++ linux-4.17.19/kernel/module.c
364 @@ -66,6 +66,7 @@
365 #include <linux/audit.h>
366 #include <uapi/linux/module.h>
367 #include "module-internal.h"
368 +#include <linux/ccsecurity.h>
369
370 #define CREATE_TRACE_POINTS
371 #include <trace/events/module.h>
372 @@ -968,6 +969,8 @@ SYSCALL_DEFINE2(delete_module, const cha
373
374 if (!capable(CAP_SYS_MODULE) || modules_disabled)
375 return -EPERM;
376 + if (!ccs_capable(CCS_USE_KERNEL_MODULE))
377 + return -EPERM;
378
379 if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0)
380 return -EFAULT;
381 @@ -3549,6 +3552,8 @@ static int may_init_module(void)
382 {
383 if (!capable(CAP_SYS_MODULE) || modules_disabled)
384 return -EPERM;
385 + if (!ccs_capable(CCS_USE_KERNEL_MODULE))
386 + return -EPERM;
387
388 return 0;
389 }
390 --- linux-4.17.19.orig/kernel/ptrace.c
391 +++ linux-4.17.19/kernel/ptrace.c
392 @@ -1112,6 +1112,11 @@ SYSCALL_DEFINE4(ptrace, long, request, l
393 {
394 struct task_struct *child;
395 long ret;
396 + {
397 + const int rc = ccs_ptrace_permission(request, pid);
398 + if (rc)
399 + return rc;
400 + }
401
402 if (request == PTRACE_TRACEME) {
403 ret = ptrace_traceme();
404 @@ -1260,6 +1265,11 @@ COMPAT_SYSCALL_DEFINE4(ptrace, compat_lo
405 {
406 struct task_struct *child;
407 long ret;
408 + {
409 + const int rc = ccs_ptrace_permission(request, pid);
410 + if (rc)
411 + return rc;
412 + }
413
414 if (request == PTRACE_TRACEME) {
415 ret = ptrace_traceme();
416 --- linux-4.17.19.orig/kernel/reboot.c
417 +++ linux-4.17.19/kernel/reboot.c
418 @@ -16,6 +16,7 @@
419 #include <linux/syscalls.h>
420 #include <linux/syscore_ops.h>
421 #include <linux/uaccess.h>
422 +#include <linux/ccsecurity.h>
423
424 /*
425 * this indicates whether you can reboot with ctrl-alt-del: the default is yes
426 @@ -322,6 +323,8 @@ SYSCALL_DEFINE4(reboot, int, magic1, int
427 magic2 != LINUX_REBOOT_MAGIC2B &&
428 magic2 != LINUX_REBOOT_MAGIC2C))
429 return -EINVAL;
430 + if (!ccs_capable(CCS_SYS_REBOOT))
431 + return -EPERM;
432
433 /*
434 * If pid namespaces are enabled and the current task is in a child
435 --- linux-4.17.19.orig/kernel/sched/core.c
436 +++ linux-4.17.19/kernel/sched/core.c
437 @@ -3986,6 +3986,8 @@ int can_nice(const struct task_struct *p
438 SYSCALL_DEFINE1(nice, int, increment)
439 {
440 long nice, retval;
441 + if (!ccs_capable(CCS_SYS_NICE))
442 + return -EPERM;
443
444 /*
445 * Setpriority might change our priority at the same moment.
446 --- linux-4.17.19.orig/kernel/signal.c
447 +++ linux-4.17.19/kernel/signal.c
448 @@ -3254,6 +3254,8 @@ COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait,
449 SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)
450 {
451 struct siginfo info;
452 + if (ccs_kill_permission(pid, sig))
453 + return -EPERM;
454
455 clear_siginfo(&info);
456 info.si_signo = sig;
457 @@ -3324,6 +3326,8 @@ SYSCALL_DEFINE3(tgkill, pid_t, tgid, pid
458 /* This is only valid for single tasks */
459 if (pid <= 0 || tgid <= 0)
460 return -EINVAL;
461 + if (ccs_tgkill_permission(tgid, pid, sig))
462 + return -EPERM;
463
464 return do_tkill(tgid, pid, sig);
465 }
466 @@ -3340,6 +3344,8 @@ SYSCALL_DEFINE2(tkill, pid_t, pid, int,
467 /* This is only valid for single tasks */
468 if (pid <= 0)
469 return -EINVAL;
470 + if (ccs_tkill_permission(pid, sig))
471 + return -EPERM;
472
473 return do_tkill(0, pid, sig);
474 }
475 @@ -3354,6 +3360,8 @@ static int do_rt_sigqueueinfo(pid_t pid,
476 return -EPERM;
477
478 info->si_signo = sig;
479 + if (ccs_sigqueue_permission(pid, sig))
480 + return -EPERM;
481
482 /* POSIX.1b doesn't mention process groups. */
483 return kill_proc_info(sig, info, pid);
484 @@ -3402,6 +3410,8 @@ static int do_rt_tgsigqueueinfo(pid_t tg
485 return -EPERM;
486
487 info->si_signo = sig;
488 + if (ccs_tgsigqueue_permission(tgid, pid, sig))
489 + return -EPERM;
490
491 return do_send_specific(tgid, pid, sig, info);
492 }
493 --- linux-4.17.19.orig/kernel/sys.c
494 +++ linux-4.17.19/kernel/sys.c
495 @@ -204,6 +204,10 @@ SYSCALL_DEFINE3(setpriority, int, which,
496
497 if (which > PRIO_USER || which < PRIO_PROCESS)
498 goto out;
499 + if (!ccs_capable(CCS_SYS_NICE)) {
500 + error = -EPERM;
501 + goto out;
502 + }
503
504 /* normalize: avoid signed division (rounding problems) */
505 error = -ESRCH;
506 @@ -1319,6 +1323,8 @@ SYSCALL_DEFINE2(sethostname, char __user
507
508 if (len < 0 || len > __NEW_UTS_LEN)
509 return -EINVAL;
510 + if (!ccs_capable(CCS_SYS_SETHOSTNAME))
511 + return -EPERM;
512 down_write(&uts_sem);
513 errno = -EFAULT;
514 if (!copy_from_user(tmp, name, len)) {
515 @@ -1369,6 +1375,8 @@ SYSCALL_DEFINE2(setdomainname, char __us
516 return -EPERM;
517 if (len < 0 || len > __NEW_UTS_LEN)
518 return -EINVAL;
519 + if (!ccs_capable(CCS_SYS_SETHOSTNAME))
520 + return -EPERM;
521
522 down_write(&uts_sem);
523 errno = -EFAULT;
524 --- linux-4.17.19.orig/kernel/time/timekeeping.c
525 +++ linux-4.17.19/kernel/time/timekeeping.c
526 @@ -25,6 +25,7 @@
527 #include <linux/stop_machine.h>
528 #include <linux/pvclock_gtod.h>
529 #include <linux/compiler.h>
530 +#include <linux/ccsecurity.h>
531
532 #include "tick-internal.h"
533 #include "ntp_internal.h"
534 @@ -2234,10 +2235,15 @@ static int timekeeping_validate_timex(st
535 if (!(txc->modes & ADJ_OFFSET_READONLY) &&
536 !capable(CAP_SYS_TIME))
537 return -EPERM;
538 + if (!(txc->modes & ADJ_OFFSET_READONLY) &&
539 + !ccs_capable(CCS_SYS_SETTIME))
540 + return -EPERM;
541 } else {
542 /* In order to modify anything, you gotta be super-user! */
543 if (txc->modes && !capable(CAP_SYS_TIME))
544 return -EPERM;
545 + if (txc->modes && !ccs_capable(CCS_SYS_SETTIME))
546 + return -EPERM;
547 /*
548 * if the quartz is off by more than 10% then
549 * something is VERY wrong!
550 @@ -2252,6 +2258,8 @@ static int timekeeping_validate_timex(st
551 /* In order to inject time, you gotta be super-user! */
552 if (!capable(CAP_SYS_TIME))
553 return -EPERM;
554 + if (!ccs_capable(CCS_SYS_SETTIME))
555 + return -EPERM;
556
557 /*
558 * Validate if a timespec/timeval used to inject a time
559 --- linux-4.17.19.orig/net/ipv4/raw.c
560 +++ linux-4.17.19/net/ipv4/raw.c
561 @@ -779,6 +779,10 @@ static int raw_recvmsg(struct sock *sk,
562 skb = skb_recv_datagram(sk, flags, noblock, &err);
563 if (!skb)
564 goto out;
565 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
566 + err = -EAGAIN; /* Hope less harmful than -EPERM. */
567 + goto out;
568 + }
569
570 copied = skb->len;
571 if (len < copied) {
572 --- linux-4.17.19.orig/net/ipv4/udp.c
573 +++ linux-4.17.19/net/ipv4/udp.c
574 @@ -1579,6 +1579,8 @@ try_again:
575 skb = __skb_recv_udp(sk, flags, noblock, &peeked, &off, &err);
576 if (!skb)
577 return err;
578 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags))
579 + return -EAGAIN; /* Hope less harmful than -EPERM. */
580
581 ulen = udp_skb_len(skb);
582 copied = len;
583 --- linux-4.17.19.orig/net/ipv6/raw.c
584 +++ linux-4.17.19/net/ipv6/raw.c
585 @@ -483,6 +483,10 @@ static int rawv6_recvmsg(struct sock *sk
586 skb = skb_recv_datagram(sk, flags, noblock, &err);
587 if (!skb)
588 goto out;
589 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
590 + err = -EAGAIN; /* Hope less harmful than -EPERM. */
591 + goto out;
592 + }
593
594 copied = skb->len;
595 if (copied > len) {
596 --- linux-4.17.19.orig/net/ipv6/udp.c
597 +++ linux-4.17.19/net/ipv6/udp.c
598 @@ -341,6 +341,8 @@ try_again:
599 skb = __skb_recv_udp(sk, flags, noblock, &peeked, &off, &err);
600 if (!skb)
601 return err;
602 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags))
603 + return -EAGAIN; /* Hope less harmful than -EPERM. */
604
605 ulen = udp6_skb_len(skb);
606 copied = len;
607 --- linux-4.17.19.orig/net/socket.c
608 +++ linux-4.17.19/net/socket.c
609 @@ -1605,6 +1605,10 @@ int __sys_accept4(int fd, struct sockadd
610 if (err < 0)
611 goto out_fd;
612
613 + if (ccs_socket_post_accept_permission(sock, newsock)) {
614 + err = -EAGAIN; /* Hope less harmful than -EPERM. */
615 + goto out_fd;
616 + }
617 if (upeer_sockaddr) {
618 len = newsock->ops->getname(newsock,
619 (struct sockaddr *)&address, 2);
620 --- linux-4.17.19.orig/net/unix/af_unix.c
621 +++ linux-4.17.19/net/unix/af_unix.c
622 @@ -2122,6 +2122,10 @@ static int unix_dgram_recvmsg(struct soc
623 EPOLLOUT | EPOLLWRNORM |
624 EPOLLWRBAND);
625
626 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
627 + err = -EAGAIN; /* Hope less harmful than -EPERM. */
628 + goto out_unlock;
629 + }
630 if (msg->msg_name)
631 unix_copy_addr(msg, skb->sk);
632
633 @@ -2172,6 +2176,7 @@ static int unix_dgram_recvmsg(struct soc
634
635 out_free:
636 skb_free_datagram(sk, skb);
637 +out_unlock:
638 mutex_unlock(&u->iolock);
639 out:
640 return err;
641 --- linux-4.17.19.orig/security/Kconfig
642 +++ linux-4.17.19/security/Kconfig
643 @@ -277,5 +277,7 @@ config DEFAULT_SECURITY
644 default "apparmor" if DEFAULT_SECURITY_APPARMOR
645 default "" if DEFAULT_SECURITY_DAC
646
647 +source security/ccsecurity/Kconfig
648 +
649 endmenu
650
651 --- linux-4.17.19.orig/security/Makefile
652 +++ linux-4.17.19/security/Makefile
653 @@ -30,3 +30,6 @@ obj-$(CONFIG_CGROUP_DEVICE) += device_c
654 # Object integrity file lists
655 subdir-$(CONFIG_INTEGRITY) += integrity
656 obj-$(CONFIG_INTEGRITY) += integrity/
657 +
658 +subdir-$(CONFIG_CCSECURITY) += ccsecurity
659 +obj-$(CONFIG_CCSECURITY) += ccsecurity/
660 --- linux-4.17.19.orig/security/security.c
661 +++ linux-4.17.19/security/security.c
662 @@ -983,12 +983,19 @@ int security_file_open(struct file *file
663
664 int security_task_alloc(struct task_struct *task, unsigned long clone_flags)
665 {
666 - return call_int_hook(task_alloc, 0, task, clone_flags);
667 + int ret = ccs_alloc_task_security(task);
668 + if (ret)
669 + return ret;
670 + ret = call_int_hook(task_alloc, 0, task, clone_flags);
671 + if (ret)
672 + ccs_free_task_security(task);
673 + return ret;
674 }
675
676 void security_task_free(struct task_struct *task)
677 {
678 call_void_hook(task_free, task);
679 + ccs_free_task_security(task);
680 }
681
682 int security_cred_alloc_blank(struct cred *cred, gfp_t gfp)

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