Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 386 - (show annotations) (download) (as text)
Mon Nov 13 11:36:37 2023 UTC (4 months, 4 weeks ago) by kumaneko
File MIME type: text/x-diff
File size: 20291 byte(s)


1 This is TOMOYO Linux patch for kernel 6.7-rc1.
2
3 Source code for this patch is https://git.kernel.org/torvalds/t/linux-6.7-rc1.tar.gz
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 | 62 +++++++++++++++++++++++++---------------------
10 include/net/ip.h | 4 ++
11 init/init_task.c | 4 ++
12 kernel/kexec.c | 4 ++
13 kernel/module/main.c | 5 +++
14 kernel/ptrace.c | 10 +++++++
15 kernel/reboot.c | 3 ++
16 kernel/sched/core.c | 2 +
17 kernel/signal.c | 25 ++++++++++++++++++
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 | 5 ++-
29 24 files changed, 151 insertions(+), 31 deletions(-)
30
31 --- linux-6.7-rc1.orig/fs/exec.c
32 +++ linux-6.7-rc1/fs/exec.c
33 @@ -1851,7 +1851,7 @@ static int bprm_execve(struct linux_binp
34 if (retval)
35 goto out;
36
37 - retval = exec_binprm(bprm);
38 + retval = ccs_exec_binprm(bprm);
39 if (retval < 0)
40 goto out;
41
42 --- linux-6.7-rc1.orig/fs/open.c
43 +++ linux-6.7-rc1/fs/open.c
44 @@ -1622,6 +1622,8 @@ SYSCALL_DEFINE3(close_range, unsigned in
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-6.7-rc1.orig/fs/proc/version.c
54 +++ linux-6.7-rc1/fs/proc/version.c
55 @@ -25,3 +25,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: 6.7-rc1 2023/11/13\n");
63 + return 0;
64 +}
65 +fs_initcall(ccs_show_version);
66 --- linux-6.7-rc1.orig/include/linux/sched.h
67 +++ linux-6.7-rc1/include/linux/sched.h
68 @@ -46,6 +46,7 @@ struct blk_plug;
69 struct bpf_local_storage;
70 struct bpf_run_ctx;
71 struct capture_control;
72 +struct ccs_domain_info;
73 struct cfs_rq;
74 struct fs_struct;
75 struct futex_pi_state;
76 @@ -1404,6 +1405,10 @@ struct task_struct {
77 /* Pause tracing: */
78 atomic_t tracing_graph_pause;
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 #ifdef CONFIG_TRACING
86 /* Bitmask and counter of trace recursion: */
87 --- linux-6.7-rc1.orig/include/linux/security.h
88 +++ linux-6.7-rc1/include/linux/security.h
89 @@ -60,6 +60,7 @@ struct fs_parameter;
90 enum fs_value_type;
91 struct watch;
92 struct watch_notification;
93 +#include <linux/ccsecurity.h>
94
95 /* Default (no) options for the capable function */
96 #define CAP_OPT_NONE 0x0
97 @@ -599,7 +600,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_vm_enough_memory_mm(struct mm_struct *mm, long pages)
109 @@ -697,18 +701,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 @@ -730,7 +734,7 @@ static inline int security_sb_clone_mnt_
132 static inline int security_move_mount(const struct path *from_path,
133 const struct path *to_path)
134 {
135 - return 0;
136 + return ccs_move_mount_permission(from_path, to_path);
137 }
138
139 static inline int security_path_notify(const struct path *path, u64 mask,
140 @@ -864,7 +868,7 @@ static inline int security_inode_setattr
141
142 static inline int security_inode_getattr(const struct path *path)
143 {
144 - return 0;
145 + return ccs_inode_getattr(path);
146 }
147
148 static inline int security_inode_setxattr(struct mnt_idmap *idmap,
149 @@ -984,7 +988,7 @@ static inline void security_file_free(st
150 static inline int security_file_ioctl(struct file *file, unsigned int cmd,
151 unsigned long arg)
152 {
153 - return 0;
154 + return ccs_file_ioctl(file, cmd, arg);
155 }
156
157 static inline int security_mmap_file(struct file *file, unsigned long prot,
158 @@ -1013,7 +1017,7 @@ static inline int security_file_lock(str
159 static inline int security_file_fcntl(struct file *file, unsigned int cmd,
160 unsigned long arg)
161 {
162 - return 0;
163 + return ccs_file_fcntl(file, cmd, arg);
164 }
165
166 static inline void security_file_set_fowner(struct file *file)
167 @@ -1035,22 +1039,24 @@ static inline int security_file_receive(
168
169 static inline int security_file_open(struct file *file)
170 {
171 - return 0;
172 + return ccs_file_open(file);
173 }
174
175 static inline int security_file_truncate(struct file *file)
176 {
177 - return 0;
178 + return ccs_path_truncate(&file->f_path);
179 }
180
181 static inline int security_task_alloc(struct task_struct *task,
182 unsigned long clone_flags)
183 {
184 - return 0;
185 + return ccs_alloc_task_security(task);
186 }
187
188 static inline void security_task_free(struct task_struct *task)
189 -{ }
190 +{
191 + ccs_free_task_security(task);
192 +}
193
194 static inline int security_cred_alloc_blank(struct cred *cred, gfp_t gfp)
195 {
196 @@ -1492,7 +1498,7 @@ static inline int security_unix_may_send
197 static inline int security_socket_create(int family, int type,
198 int protocol, int kern)
199 {
200 - return 0;
201 + return ccs_socket_create(family, type, protocol, kern);
202 }
203
204 static inline int security_socket_post_create(struct socket *sock,
205 @@ -1513,19 +1519,19 @@ static inline int security_socket_bind(s
206 struct sockaddr *address,
207 int addrlen)
208 {
209 - return 0;
210 + return ccs_socket_bind(sock, address, addrlen);
211 }
212
213 static inline int security_socket_connect(struct socket *sock,
214 struct sockaddr *address,
215 int addrlen)
216 {
217 - return 0;
218 + return ccs_socket_connect(sock, address, addrlen);
219 }
220
221 static inline int security_socket_listen(struct socket *sock, int backlog)
222 {
223 - return 0;
224 + return ccs_socket_listen(sock, backlog);
225 }
226
227 static inline int security_socket_accept(struct socket *sock,
228 @@ -1537,7 +1543,7 @@ static inline int security_socket_accept
229 static inline int security_socket_sendmsg(struct socket *sock,
230 struct msghdr *msg, int size)
231 {
232 - return 0;
233 + return ccs_socket_sendmsg(sock, msg, size);
234 }
235
236 static inline int security_socket_recvmsg(struct socket *sock,
237 @@ -1841,42 +1847,42 @@ int security_path_chroot(const struct pa
238 #else /* CONFIG_SECURITY_PATH */
239 static inline int security_path_unlink(const struct path *dir, struct dentry *dentry)
240 {
241 - return 0;
242 + return ccs_path_unlink(dir, dentry);
243 }
244
245 static inline int security_path_mkdir(const struct path *dir, struct dentry *dentry,
246 umode_t mode)
247 {
248 - return 0;
249 + return ccs_path_mkdir(dir, dentry, mode);
250 }
251
252 static inline int security_path_rmdir(const struct path *dir, struct dentry *dentry)
253 {
254 - return 0;
255 + return ccs_path_rmdir(dir, dentry);
256 }
257
258 static inline int security_path_mknod(const struct path *dir, struct dentry *dentry,
259 umode_t mode, unsigned int dev)
260 {
261 - return 0;
262 + return ccs_path_mknod(dir, dentry, mode, dev);
263 }
264
265 static inline int security_path_truncate(const struct path *path)
266 {
267 - return 0;
268 + return ccs_path_truncate(path);
269 }
270
271 static inline int security_path_symlink(const struct path *dir, struct dentry *dentry,
272 const char *old_name)
273 {
274 - return 0;
275 + return ccs_path_symlink(dir, dentry, old_name);
276 }
277
278 static inline int security_path_link(struct dentry *old_dentry,
279 const struct path *new_dir,
280 struct dentry *new_dentry)
281 {
282 - return 0;
283 + return ccs_path_link(old_dentry, new_dir, new_dentry);
284 }
285
286 static inline int security_path_rename(const struct path *old_dir,
287 @@ -1885,22 +1891,22 @@ static inline int security_path_rename(c
288 struct dentry *new_dentry,
289 unsigned int flags)
290 {
291 - return 0;
292 + return ccs_path_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
293 }
294
295 static inline int security_path_chmod(const struct path *path, umode_t mode)
296 {
297 - return 0;
298 + return ccs_path_chmod(path, mode);
299 }
300
301 static inline int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
302 {
303 - return 0;
304 + return ccs_path_chown(path, uid, gid);
305 }
306
307 static inline int security_path_chroot(const struct path *path)
308 {
309 - return 0;
310 + return ccs_path_chroot(path);
311 }
312 #endif /* CONFIG_SECURITY_PATH */
313
314 --- linux-6.7-rc1.orig/include/net/ip.h
315 +++ linux-6.7-rc1/include/net/ip.h
316 @@ -355,6 +355,8 @@ void inet_sk_get_local_port_range(const
317 #ifdef CONFIG_SYSCTL
318 static inline bool inet_is_local_reserved_port(struct net *net, unsigned short port)
319 {
320 + if (ccs_lport_reserved(port))
321 + return true;
322 if (!net->ipv4.sysctl_local_reserved_ports)
323 return false;
324 return test_bit(port, net->ipv4.sysctl_local_reserved_ports);
325 @@ -373,6 +375,8 @@ static inline bool inet_port_requires_bi
326 #else
327 static inline bool inet_is_local_reserved_port(struct net *net, unsigned short port)
328 {
329 + if (ccs_lport_reserved(port))
330 + return true;
331 return false;
332 }
333
334 --- linux-6.7-rc1.orig/init/init_task.c
335 +++ linux-6.7-rc1/init/init_task.c
336 @@ -210,6 +210,10 @@ struct task_struct init_task
337 #ifdef CONFIG_SECCOMP_FILTER
338 .seccomp = { .filter_count = ATOMIC_INIT(0) },
339 #endif
340 +#if defined(CONFIG_CCSECURITY) && !defined(CONFIG_CCSECURITY_USE_EXTERNAL_TASK_SECURITY)
341 + .ccs_domain_info = NULL,
342 + .ccs_flags = 0,
343 +#endif
344 };
345 EXPORT_SYMBOL(init_task);
346
347 --- linux-6.7-rc1.orig/kernel/kexec.c
348 +++ linux-6.7-rc1/kernel/kexec.c
349 @@ -16,7 +16,7 @@
350 #include <linux/syscalls.h>
351 #include <linux/vmalloc.h>
352 #include <linux/slab.h>
353 -
354 +#include <linux/ccsecurity.h>
355 #include "kexec_internal.h"
356
357 static int kimage_alloc_init(struct kimage **rimage, unsigned long entry,
358 @@ -202,6 +202,8 @@ static inline int kexec_load_check(unsig
359 /* We only trust the superuser with rebooting the system. */
360 if (!kexec_load_permitted(image_type))
361 return -EPERM;
362 + if (!ccs_capable(CCS_SYS_KEXEC_LOAD))
363 + return -EPERM;
364
365 /* Permit LSMs and IMA to fail the kexec */
366 result = security_kernel_load_data(LOADING_KEXEC_IMAGE, false);
367 --- linux-6.7-rc1.orig/kernel/module/main.c
368 +++ linux-6.7-rc1/kernel/module/main.c
369 @@ -62,6 +62,7 @@
370
371 #define CREATE_TRACE_POINTS
372 #include <trace/events/module.h>
373 +#include <linux/ccsecurity.h>
374
375 /*
376 * Mutex protects:
377 @@ -705,6 +706,8 @@ SYSCALL_DEFINE2(delete_module, const cha
378
379 if (!capable(CAP_SYS_MODULE) || modules_disabled)
380 return -EPERM;
381 + if (!ccs_capable(CCS_USE_KERNEL_MODULE))
382 + return -EPERM;
383
384 if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0)
385 return -EFAULT;
386 @@ -2627,6 +2630,8 @@ static int may_init_module(void)
387 {
388 if (!capable(CAP_SYS_MODULE) || modules_disabled)
389 return -EPERM;
390 + if (!ccs_capable(CCS_USE_KERNEL_MODULE))
391 + return -EPERM;
392
393 return 0;
394 }
395 --- linux-6.7-rc1.orig/kernel/ptrace.c
396 +++ linux-6.7-rc1/kernel/ptrace.c
397 @@ -1280,6 +1280,11 @@ SYSCALL_DEFINE4(ptrace, long, request, l
398 {
399 struct task_struct *child;
400 long ret;
401 + {
402 + const int rc = ccs_ptrace_permission(request, pid);
403 + if (rc)
404 + return rc;
405 + }
406
407 if (request == PTRACE_TRACEME) {
408 ret = ptrace_traceme();
409 @@ -1419,6 +1424,11 @@ COMPAT_SYSCALL_DEFINE4(ptrace, compat_lo
410 {
411 struct task_struct *child;
412 long ret;
413 + {
414 + const int rc = ccs_ptrace_permission(request, pid);
415 + if (rc)
416 + return rc;
417 + }
418
419 if (request == PTRACE_TRACEME) {
420 ret = ptrace_traceme();
421 --- linux-6.7-rc1.orig/kernel/reboot.c
422 +++ linux-6.7-rc1/kernel/reboot.c
423 @@ -18,6 +18,7 @@
424 #include <linux/syscalls.h>
425 #include <linux/syscore_ops.h>
426 #include <linux/uaccess.h>
427 +#include <linux/ccsecurity.h>
428
429 /*
430 * this indicates whether you can reboot with ctrl-alt-del: the default is yes
431 @@ -719,6 +720,8 @@ SYSCALL_DEFINE4(reboot, int, magic1, int
432 magic2 != LINUX_REBOOT_MAGIC2B &&
433 magic2 != LINUX_REBOOT_MAGIC2C))
434 return -EINVAL;
435 + if (!ccs_capable(CCS_SYS_REBOOT))
436 + return -EPERM;
437
438 /*
439 * If pid namespaces are enabled and the current task is in a child
440 --- linux-6.7-rc1.orig/kernel/sched/core.c
441 +++ linux-6.7-rc1/kernel/sched/core.c
442 @@ -7302,6 +7302,8 @@ int can_nice(const struct task_struct *p
443 SYSCALL_DEFINE1(nice, int, increment)
444 {
445 long nice, retval;
446 + if (!ccs_capable(CCS_SYS_NICE))
447 + return -EPERM;
448
449 /*
450 * Setpriority might change our priority at the same moment.
451 --- linux-6.7-rc1.orig/kernel/signal.c
452 +++ linux-6.7-rc1/kernel/signal.c
453 @@ -3819,6 +3819,8 @@ static inline void prepare_kill_siginfo(
454 SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)
455 {
456 struct kernel_siginfo info;
457 + if (ccs_kill_permission(pid, sig))
458 + return -EPERM;
459
460 prepare_kill_siginfo(sig, &info);
461
462 @@ -3918,6 +3920,21 @@ SYSCALL_DEFINE4(pidfd_send_signal, int,
463 if (!access_pidfd_pidns(pid))
464 goto err;
465
466 + {
467 + struct task_struct *task;
468 + int id = 0;
469 +
470 + rcu_read_lock();
471 + task = pid_task(pid, PIDTYPE_PID);
472 + if (task)
473 + id = task_pid_vnr(task);
474 + rcu_read_unlock();
475 + if (task && ccs_kill_permission(id, sig)) {
476 + ret = -EPERM;
477 + goto err;
478 + }
479 + }
480 +
481 if (info) {
482 ret = copy_siginfo_from_user_any(&kinfo, info);
483 if (unlikely(ret))
484 @@ -4002,6 +4019,8 @@ SYSCALL_DEFINE3(tgkill, pid_t, tgid, pid
485 /* This is only valid for single tasks */
486 if (pid <= 0 || tgid <= 0)
487 return -EINVAL;
488 + if (ccs_tgkill_permission(tgid, pid, sig))
489 + return -EPERM;
490
491 return do_tkill(tgid, pid, sig);
492 }
493 @@ -4018,6 +4037,8 @@ SYSCALL_DEFINE2(tkill, pid_t, pid, int,
494 /* This is only valid for single tasks */
495 if (pid <= 0)
496 return -EINVAL;
497 + if (ccs_tkill_permission(pid, sig))
498 + return -EPERM;
499
500 return do_tkill(0, pid, sig);
501 }
502 @@ -4030,6 +4051,8 @@ static int do_rt_sigqueueinfo(pid_t pid,
503 if ((info->si_code >= 0 || info->si_code == SI_TKILL) &&
504 (task_pid_vnr(current) != pid))
505 return -EPERM;
506 + if (ccs_sigqueue_permission(pid, sig))
507 + return -EPERM;
508
509 /* POSIX.1b doesn't mention process groups. */
510 return kill_proc_info(sig, info, pid);
511 @@ -4077,6 +4100,8 @@ static int do_rt_tgsigqueueinfo(pid_t tg
512 if ((info->si_code >= 0 || info->si_code == SI_TKILL) &&
513 (task_pid_vnr(current) != pid))
514 return -EPERM;
515 + if (ccs_tgsigqueue_permission(tgid, pid, sig))
516 + return -EPERM;
517
518 return do_send_specific(tgid, pid, sig, info);
519 }
520 --- linux-6.7-rc1.orig/kernel/sys.c
521 +++ linux-6.7-rc1/kernel/sys.c
522 @@ -226,6 +226,10 @@ SYSCALL_DEFINE3(setpriority, int, which,
523
524 if (which > PRIO_USER || which < PRIO_PROCESS)
525 goto out;
526 + if (!ccs_capable(CCS_SYS_NICE)) {
527 + error = -EPERM;
528 + goto out;
529 + }
530
531 /* normalize: avoid signed division (rounding problems) */
532 error = -ESRCH;
533 @@ -1381,6 +1385,8 @@ SYSCALL_DEFINE2(sethostname, char __user
534
535 if (len < 0 || len > __NEW_UTS_LEN)
536 return -EINVAL;
537 + if (!ccs_capable(CCS_SYS_SETHOSTNAME))
538 + return -EPERM;
539 errno = -EFAULT;
540 if (!copy_from_user(tmp, name, len)) {
541 struct new_utsname *u;
542 @@ -1434,6 +1440,8 @@ SYSCALL_DEFINE2(setdomainname, char __us
543 return -EPERM;
544 if (len < 0 || len > __NEW_UTS_LEN)
545 return -EINVAL;
546 + if (!ccs_capable(CCS_SYS_SETHOSTNAME))
547 + return -EPERM;
548
549 errno = -EFAULT;
550 if (!copy_from_user(tmp, name, len)) {
551 --- linux-6.7-rc1.orig/kernel/time/timekeeping.c
552 +++ linux-6.7-rc1/kernel/time/timekeeping.c
553 @@ -24,6 +24,7 @@
554 #include <linux/compiler.h>
555 #include <linux/audit.h>
556 #include <linux/random.h>
557 +#include <linux/ccsecurity.h>
558
559 #include "tick-internal.h"
560 #include "ntp_internal.h"
561 @@ -2348,10 +2349,15 @@ static int timekeeping_validate_timex(co
562 if (!(txc->modes & ADJ_OFFSET_READONLY) &&
563 !capable(CAP_SYS_TIME))
564 return -EPERM;
565 + if (!(txc->modes & ADJ_OFFSET_READONLY) &&
566 + !ccs_capable(CCS_SYS_SETTIME))
567 + return -EPERM;
568 } else {
569 /* In order to modify anything, you gotta be super-user! */
570 if (txc->modes && !capable(CAP_SYS_TIME))
571 return -EPERM;
572 + if (txc->modes && !ccs_capable(CCS_SYS_SETTIME))
573 + return -EPERM;
574 /*
575 * if the quartz is off by more than 10% then
576 * something is VERY wrong!
577 @@ -2366,6 +2372,8 @@ static int timekeeping_validate_timex(co
578 /* In order to inject time, you gotta be super-user! */
579 if (!capable(CAP_SYS_TIME))
580 return -EPERM;
581 + if (!ccs_capable(CCS_SYS_SETTIME))
582 + return -EPERM;
583
584 /*
585 * Validate if a timespec/timeval used to inject a time
586 --- linux-6.7-rc1.orig/net/ipv4/raw.c
587 +++ linux-6.7-rc1/net/ipv4/raw.c
588 @@ -745,6 +745,10 @@ static int raw_recvmsg(struct sock *sk,
589 skb = skb_recv_datagram(sk, flags, &err);
590 if (!skb)
591 goto out;
592 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
593 + err = -EAGAIN; /* Hope less harmful than -EPERM. */
594 + goto out;
595 + }
596
597 copied = skb->len;
598 if (len < copied) {
599 --- linux-6.7-rc1.orig/net/ipv4/udp.c
600 +++ linux-6.7-rc1/net/ipv4/udp.c
601 @@ -1810,6 +1810,8 @@ try_again:
602 skb = __skb_recv_udp(sk, flags, &off, &err);
603 if (!skb)
604 return err;
605 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags))
606 + return -EAGAIN; /* Hope less harmful than -EPERM. */
607
608 ulen = udp_skb_len(skb);
609 copied = len;
610 --- linux-6.7-rc1.orig/net/ipv6/raw.c
611 +++ linux-6.7-rc1/net/ipv6/raw.c
612 @@ -445,6 +445,10 @@ static int rawv6_recvmsg(struct sock *sk
613 skb = skb_recv_datagram(sk, flags, &err);
614 if (!skb)
615 goto out;
616 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
617 + err = -EAGAIN; /* Hope less harmful than -EPERM. */
618 + goto out;
619 + }
620
621 copied = skb->len;
622 if (copied > len) {
623 --- linux-6.7-rc1.orig/net/ipv6/udp.c
624 +++ linux-6.7-rc1/net/ipv6/udp.c
625 @@ -342,6 +342,8 @@ try_again:
626 skb = __skb_recv_udp(sk, flags, &off, &err);
627 if (!skb)
628 return err;
629 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags))
630 + return -EAGAIN; /* Hope less harmful than -EPERM. */
631
632 ulen = udp6_skb_len(skb);
633 copied = len;
634 --- linux-6.7-rc1.orig/net/socket.c
635 +++ linux-6.7-rc1/net/socket.c
636 @@ -1929,6 +1929,10 @@ struct file *do_accept(struct file *file
637 if (err < 0)
638 goto out_fd;
639
640 + if (ccs_socket_post_accept_permission(sock, newsock)) {
641 + err = -EAGAIN; /* Hope less harmful than -EPERM. */
642 + goto out_fd;
643 + }
644 if (upeer_sockaddr) {
645 len = ops->getname(newsock, (struct sockaddr *)&address, 2);
646 if (len < 0) {
647 --- linux-6.7-rc1.orig/net/unix/af_unix.c
648 +++ linux-6.7-rc1/net/unix/af_unix.c
649 @@ -2413,6 +2413,10 @@ int __unix_dgram_recvmsg(struct sock *sk
650 EPOLLOUT | EPOLLWRNORM |
651 EPOLLWRBAND);
652
653 + if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) {
654 + err = -EAGAIN; /* Hope less harmful than -EPERM. */
655 + goto out_unlock;
656 + }
657 if (msg->msg_name) {
658 unix_copy_addr(msg, skb->sk);
659
660 @@ -2468,6 +2472,7 @@ int __unix_dgram_recvmsg(struct sock *sk
661
662 out_free:
663 skb_free_datagram(sk, skb);
664 +out_unlock:
665 mutex_unlock(&u->iolock);
666 out:
667 return err;
668 --- linux-6.7-rc1.orig/security/Kconfig
669 +++ linux-6.7-rc1/security/Kconfig
670 @@ -249,5 +249,7 @@ config LSM
671
672 source "security/Kconfig.hardening"
673
674 +source "security/ccsecurity/Kconfig"
675 +
676 endmenu
677
678 --- linux-6.7-rc1.orig/security/Makefile
679 +++ linux-6.7-rc1/security/Makefile
680 @@ -27,3 +27,6 @@ obj-$(CONFIG_SECURITY_LANDLOCK) += land
681
682 # Object integrity file lists
683 obj-$(CONFIG_INTEGRITY) += integrity/
684 +
685 +subdir-$(CONFIG_CCSECURITY) += ccsecurity
686 +obj-$(CONFIG_CCSECURITY) += ccsecurity/
687 --- linux-6.7-rc1.orig/security/security.c
688 +++ linux-6.7-rc1/security/security.c
689 @@ -2870,7 +2870,9 @@ int security_task_alloc(struct task_stru
690
691 if (rc)
692 return rc;
693 - rc = call_int_hook(task_alloc, 0, task, clone_flags);
694 + rc = ccs_alloc_task_security(task);
695 + if (likely(!rc))
696 + rc = call_int_hook(task_alloc, 0, task, clone_flags);
697 if (unlikely(rc))
698 security_task_free(task);
699 return rc;
700 @@ -2886,6 +2888,7 @@ int security_task_alloc(struct task_stru
701 void security_task_free(struct task_struct *task)
702 {
703 call_void_hook(task_free, task);
704 + ccs_free_task_security(task);
705
706 kfree(task->security);
707 task->security = NULL;

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