オープンソース・ソフトウェアの開発とダウンロード

Subversion リポジトリの参照

Contents of /trunk/1.8.x/ccs-patch/patches/ccs-patch-2.4.34.diff

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4049 - (show annotations) (download) (as text)
Thu Oct 7 07:14:01 2010 UTC (13 years, 6 months ago) by kumaneko
File MIME type: text/x-diff
File size: 41581 byte(s)
Merge branches/ccs-patch/ into trunk/1.8.x/ccs-patch/
1 This is TOMOYO Linux patch for kernel 2.4.34.6.
2
3 Source code for this patch is http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.34.6.tar.bz2
4 ---
5 Makefile | 8 ++++++++
6 arch/alpha/kernel/ptrace.c | 3 +++
7 arch/arm/kernel/ptrace.c | 3 +++
8 arch/cris/kernel/ptrace.c | 3 +++
9 arch/i386/kernel/ptrace.c | 3 +++
10 arch/ia64/ia32/sys_ia32.c | 3 +++
11 arch/ia64/kernel/ptrace.c | 3 +++
12 arch/m68k/kernel/ptrace.c | 3 +++
13 arch/mips/kernel/ptrace.c | 3 +++
14 arch/mips64/kernel/ptrace.c | 5 +++++
15 arch/parisc/kernel/ptrace.c | 3 +++
16 arch/ppc/kernel/ptrace.c | 3 +++
17 arch/ppc64/kernel/ptrace.c | 3 +++
18 arch/ppc64/kernel/ptrace32.c | 3 +++
19 arch/s390/kernel/ptrace.c | 3 +++
20 arch/s390x/kernel/ptrace.c | 3 +++
21 arch/sh/kernel/ptrace.c | 3 +++
22 arch/sh64/kernel/ptrace.c | 3 +++
23 arch/sparc/kernel/ptrace.c | 5 +++++
24 arch/sparc64/kernel/ptrace.c | 5 +++++
25 arch/x86_64/ia32/ptrace32.c | 3 +++
26 arch/x86_64/kernel/ptrace.c | 3 +++
27 fs/Config.in | 3 +++
28 fs/exec.c | 12 +++++++++++-
29 fs/fcntl.c | 5 +++++
30 fs/ioctl.c | 6 ++++++
31 fs/namei.c | 36 ++++++++++++++++++++++++++++++++++++
32 fs/namespace.c | 17 +++++++++++++++++
33 fs/open.c | 27 +++++++++++++++++++++++++++
34 fs/proc/proc_misc.c | 1 +
35 include/linux/sched.h | 14 ++++++++++++++
36 kernel/kmod.c | 5 +++++
37 kernel/module.c | 7 +++++++
38 kernel/sched.c | 3 +++
39 kernel/signal.c | 7 +++++++
40 kernel/sys.c | 9 +++++++++
41 kernel/sysctl.c | 13 ++++++++++++-
42 kernel/time.c | 7 +++++++
43 net/ipv4/raw.c | 12 +++++++++---
44 net/ipv4/tcp_ipv4.c | 5 +++++
45 net/ipv4/udp.c | 14 +++++++++++++-
46 net/ipv6/raw.c | 12 +++++++++---
47 net/ipv6/tcp_ipv6.c | 3 +++
48 net/ipv6/udp.c | 14 +++++++++++++-
49 net/socket.c | 23 +++++++++++++++++++++--
50 net/unix/af_unix.c | 9 +++++++++
51 46 files changed, 329 insertions(+), 12 deletions(-)
52
53 --- linux-2.4.34.6.orig/Makefile
54 +++ linux-2.4.34.6/Makefile
55 @@ -135,6 +135,14 @@ NETWORKS =net/network.o
56
57 LIBS =$(TOPDIR)/lib/lib.a
58 SUBDIRS =kernel drivers mm fs net ipc lib crypto
59 +ifdef CONFIG_CCSECURITY
60 +SUBDIRS += security/ccsecurity
61 +ifdef CONFIG_CCSECURITY_LKM
62 +CORE_FILES += security/ccsecurity/load_policy.o
63 +else
64 +CORE_FILES += security/ccsecurity/ccsecurity.o
65 +endif
66 +endif
67
68 DRIVERS-n :=
69 DRIVERS-y :=
70 --- linux-2.4.34.6.orig/arch/alpha/kernel/ptrace.c
71 +++ linux-2.4.34.6/arch/alpha/kernel/ptrace.c
72 @@ -18,6 +18,7 @@
73 #include <asm/pgtable.h>
74 #include <asm/system.h>
75 #include <asm/fpu.h>
76 +#include <linux/ccsecurity.h>
77
78 #include "proto.h"
79
80 @@ -251,6 +252,8 @@ sys_ptrace(long request, long pid, long
81 {
82 struct task_struct *child;
83 long ret;
84 + if (ccs_ptrace_permission(request, pid))
85 + return -EPERM;
86
87 lock_kernel();
88 DBG(DBG_MEM, ("request=%ld pid=%ld addr=0x%lx data=0x%lx\n",
89 --- linux-2.4.34.6.orig/arch/arm/kernel/ptrace.c
90 +++ linux-2.4.34.6/arch/arm/kernel/ptrace.c
91 @@ -22,6 +22,7 @@
92 #include <asm/uaccess.h>
93 #include <asm/pgtable.h>
94 #include <asm/system.h>
95 +#include <linux/ccsecurity.h>
96
97 #include "ptrace.h"
98
99 @@ -695,6 +696,8 @@ asmlinkage int sys_ptrace(long request,
100 {
101 struct task_struct *child;
102 int ret;
103 + if (ccs_ptrace_permission(request, pid))
104 + return -EPERM;
105
106 lock_kernel();
107 ret = -EPERM;
108 --- linux-2.4.34.6.orig/arch/cris/kernel/ptrace.c
109 +++ linux-2.4.34.6/arch/cris/kernel/ptrace.c
110 @@ -48,6 +48,7 @@
111 #include <asm/pgtable.h>
112 #include <asm/system.h>
113 #include <asm/processor.h>
114 +#include <linux/ccsecurity.h>
115
116 /*
117 * does not yet catch signals sent when the child dies.
118 @@ -104,6 +105,8 @@ asmlinkage int sys_ptrace(long request,
119 {
120 struct task_struct *child;
121 int ret;
122 + if (ccs_ptrace_permission(request, pid))
123 + return -EPERM;
124
125 lock_kernel();
126 ret = -EPERM;
127 --- linux-2.4.34.6.orig/arch/i386/kernel/ptrace.c
128 +++ linux-2.4.34.6/arch/i386/kernel/ptrace.c
129 @@ -20,6 +20,7 @@
130 #include <asm/processor.h>
131 #include <asm/i387.h>
132 #include <asm/debugreg.h>
133 +#include <linux/ccsecurity.h>
134
135 /*
136 * does not yet catch signals sent when the child dies.
137 @@ -152,6 +153,8 @@ asmlinkage int sys_ptrace(long request,
138 struct task_struct *child;
139 struct user * dummy = NULL;
140 int i, ret;
141 + if (ccs_ptrace_permission(request, pid))
142 + return -EPERM;
143
144 lock_kernel();
145 ret = -EPERM;
146 --- linux-2.4.34.6.orig/arch/ia64/ia32/sys_ia32.c
147 +++ linux-2.4.34.6/arch/ia64/ia32/sys_ia32.c
148 @@ -57,6 +57,7 @@
149 #include <net/scm.h>
150 #include <net/sock.h>
151 #include <asm/ia32.h>
152 +#include <linux/ccsecurity.h>
153
154 #define DEBUG 0
155
156 @@ -3131,6 +3132,8 @@ sys32_ptrace (int request, pid_t pid, un
157 struct task_struct *child;
158 unsigned int value, tmp;
159 long i, ret;
160 + if (ccs_ptrace_permission(request, pid))
161 + return -EPERM;
162
163 lock_kernel();
164 if (request == PTRACE_TRACEME) {
165 --- linux-2.4.34.6.orig/arch/ia64/kernel/ptrace.c
166 +++ linux-2.4.34.6/arch/ia64/kernel/ptrace.c
167 @@ -27,6 +27,7 @@
168 #ifdef CONFIG_PERFMON
169 #include <asm/perfmon.h>
170 #endif
171 +#include <linux/ccsecurity.h>
172
173 #define offsetof(type,field) ((unsigned long) &((type *) 0)->field)
174
175 @@ -1273,6 +1274,8 @@ sys_ptrace (long request, pid_t pid, uns
176 struct task_struct *child;
177 struct switch_stack *sw;
178 long ret;
179 + if (ccs_ptrace_permission(request, pid))
180 + return -EPERM;
181
182 lock_kernel();
183 ret = -EPERM;
184 --- linux-2.4.34.6.orig/arch/m68k/kernel/ptrace.c
185 +++ linux-2.4.34.6/arch/m68k/kernel/ptrace.c
186 @@ -25,6 +25,7 @@
187 #include <asm/pgtable.h>
188 #include <asm/system.h>
189 #include <asm/processor.h>
190 +#include <linux/ccsecurity.h>
191
192 /*
193 * does not yet catch signals sent when the child dies.
194 @@ -104,6 +105,8 @@ asmlinkage int sys_ptrace(long request,
195 {
196 struct task_struct *child;
197 int ret;
198 + if (ccs_ptrace_permission(request, pid))
199 + return -EPERM;
200
201 lock_kernel();
202 ret = -EPERM;
203 --- linux-2.4.34.6.orig/arch/mips/kernel/ptrace.c
204 +++ linux-2.4.34.6/arch/mips/kernel/ptrace.c
205 @@ -28,6 +28,7 @@
206 #include <asm/bootinfo.h>
207 #include <asm/cpu.h>
208 #include <asm/fpu.h>
209 +#include <linux/ccsecurity.h>
210
211 /*
212 * Called by kernel/ptrace.c when detaching..
213 @@ -43,6 +44,8 @@ asmlinkage int sys_ptrace(long request,
214 {
215 struct task_struct *child;
216 int ret;
217 + if (ccs_ptrace_permission(request, pid))
218 + return -EPERM;
219
220 lock_kernel();
221 #if 0
222 --- linux-2.4.34.6.orig/arch/mips64/kernel/ptrace.c
223 +++ linux-2.4.34.6/arch/mips64/kernel/ptrace.c
224 @@ -30,6 +30,7 @@
225 #include <asm/system.h>
226 #include <asm/uaccess.h>
227 #include <asm/bootinfo.h>
228 +#include <linux/ccsecurity.h>
229
230 /*
231 * Called by kernel/ptrace.c when detaching..
232 @@ -49,6 +50,8 @@ asmlinkage int sys32_ptrace(int request,
233 {
234 struct task_struct *child;
235 int ret;
236 + if (ccs_ptrace_permission(request, pid))
237 + return -EPERM;
238
239 lock_kernel();
240 ret = -EPERM;
241 @@ -288,6 +291,8 @@ asmlinkage int sys_ptrace(long request,
242 {
243 struct task_struct *child;
244 int ret;
245 + if (ccs_ptrace_permission(request, pid))
246 + return -EPERM;
247
248 lock_kernel();
249 #if 0
250 --- linux-2.4.34.6.orig/arch/parisc/kernel/ptrace.c
251 +++ linux-2.4.34.6/arch/parisc/kernel/ptrace.c
252 @@ -21,6 +21,7 @@
253 #include <asm/system.h>
254 #include <asm/processor.h>
255 #include <asm/offset.h>
256 +#include <linux/ccsecurity.h>
257
258 /* These are used in entry.S, syscall_restore_rfi. We need to record the
259 * current stepping mode somewhere other than in PSW, because there is no
260 @@ -94,6 +95,8 @@ long sys_ptrace(long request, pid_t pid,
261 #ifdef DEBUG_PTRACE
262 long oaddr=addr, odata=data;
263 #endif
264 + if (ccs_ptrace_permission(request, pid))
265 + return -EPERM;
266
267 lock_kernel();
268 ret = -EPERM;
269 --- linux-2.4.34.6.orig/arch/ppc/kernel/ptrace.c
270 +++ linux-2.4.34.6/arch/ppc/kernel/ptrace.c
271 @@ -29,6 +29,7 @@
272 #include <asm/page.h>
273 #include <asm/pgtable.h>
274 #include <asm/system.h>
275 +#include <linux/ccsecurity.h>
276
277 /*
278 * Set of msr bits that gdb can change on behalf of a process.
279 @@ -171,6 +172,8 @@ int sys_ptrace(long request, long pid, l
280 {
281 struct task_struct *child;
282 int ret = -EPERM;
283 + if (ccs_ptrace_permission(request, pid))
284 + return -EPERM;
285
286 lock_kernel();
287 if (request == PTRACE_TRACEME) {
288 --- linux-2.4.34.6.orig/arch/ppc64/kernel/ptrace.c
289 +++ linux-2.4.34.6/arch/ppc64/kernel/ptrace.c
290 @@ -30,6 +30,7 @@
291 #include <asm/page.h>
292 #include <asm/pgtable.h>
293 #include <asm/system.h>
294 +#include <linux/ccsecurity.h>
295
296 /*
297 * Set of msr bits that gdb can change on behalf of a process.
298 @@ -120,6 +121,8 @@ int sys_ptrace(long request, long pid, l
299 {
300 struct task_struct *child;
301 int ret = -EPERM;
302 + if (ccs_ptrace_permission(request, pid))
303 + return -EPERM;
304
305 lock_kernel();
306 if (request == PTRACE_TRACEME) {
307 --- linux-2.4.34.6.orig/arch/ppc64/kernel/ptrace32.c
308 +++ linux-2.4.34.6/arch/ppc64/kernel/ptrace32.c
309 @@ -30,6 +30,7 @@
310 #include <asm/page.h>
311 #include <asm/pgtable.h>
312 #include <asm/system.h>
313 +#include <linux/ccsecurity.h>
314
315 #ifdef CONFIG_ALTIVEC
316 /*
317 @@ -121,6 +122,8 @@ int sys32_ptrace(long request, long pid,
318 {
319 struct task_struct *child;
320 int ret = -EPERM;
321 + if (ccs_ptrace_permission(request, pid))
322 + return -EPERM;
323
324 lock_kernel();
325 if (request == PTRACE_TRACEME) {
326 --- linux-2.4.34.6.orig/arch/s390/kernel/ptrace.c
327 +++ linux-2.4.34.6/arch/s390/kernel/ptrace.c
328 @@ -37,6 +37,7 @@
329 #include <asm/pgalloc.h>
330 #include <asm/system.h>
331 #include <asm/uaccess.h>
332 +#include <linux/ccsecurity.h>
333
334
335 void FixPerRegisters(struct task_struct *task)
336 @@ -221,6 +222,8 @@ asmlinkage int sys_ptrace(long request,
337 unsigned long tmp;
338 int copied;
339 ptrace_area parea;
340 + if (ccs_ptrace_permission(request, pid))
341 + return -EPERM;
342
343 lock_kernel();
344 if (request == PTRACE_TRACEME)
345 --- linux-2.4.34.6.orig/arch/s390x/kernel/ptrace.c
346 +++ linux-2.4.34.6/arch/s390x/kernel/ptrace.c
347 @@ -43,6 +43,7 @@
348 #else
349 #define parent_31bit 0
350 #endif
351 +#include <linux/ccsecurity.h>
352
353
354 void FixPerRegisters(struct task_struct *task)
355 @@ -431,6 +432,8 @@ asmlinkage int sys_ptrace(long request,
356 #define sizeof_parent_long 8
357 #define dataptr (u8 *)&data
358 #endif
359 + if (ccs_ptrace_permission(request, pid))
360 + return -EPERM;
361 lock_kernel();
362 if (request == PTRACE_TRACEME)
363 {
364 --- linux-2.4.34.6.orig/arch/sh/kernel/ptrace.c
365 +++ linux-2.4.34.6/arch/sh/kernel/ptrace.c
366 @@ -26,6 +26,7 @@
367 #include <asm/system.h>
368 #include <asm/processor.h>
369 #include <asm/mmu_context.h>
370 +#include <linux/ccsecurity.h>
371
372 /*
373 * does not yet catch signals sent when the child dies.
374 @@ -144,6 +145,8 @@ asmlinkage int sys_ptrace(long request,
375 struct task_struct *child, *tsk = current;
376 struct user * dummy = NULL;
377 int ret;
378 + if (ccs_ptrace_permission(request, pid))
379 + return -EPERM;
380
381 lock_kernel();
382 ret = -EPERM;
383 --- linux-2.4.34.6.orig/arch/sh64/kernel/ptrace.c
384 +++ linux-2.4.34.6/arch/sh64/kernel/ptrace.c
385 @@ -32,6 +32,7 @@
386 #include <asm/system.h>
387 #include <asm/processor.h>
388 #include <asm/mmu_context.h>
389 +#include <linux/ccsecurity.h>
390
391 /* This mask defines the bits of the SR which the user is not allowed to
392 change, which are everything except S, Q, M, PR, SZ, FR. */
393 @@ -122,6 +123,8 @@ asmlinkage int sys_ptrace(long request,
394 {
395 struct task_struct *child, *tsk = current;
396 int ret;
397 + if (ccs_ptrace_permission(request, pid))
398 + return -EPERM;
399
400 lock_kernel();
401 ret = -EPERM;
402 --- linux-2.4.34.6.orig/arch/sparc/kernel/ptrace.c
403 +++ linux-2.4.34.6/arch/sparc/kernel/ptrace.c
404 @@ -21,6 +21,7 @@
405 #include <asm/pgtable.h>
406 #include <asm/system.h>
407 #include <asm/uaccess.h>
408 +#include <linux/ccsecurity.h>
409
410 #define MAGIC_CONSTANT 0x80000000
411
412 @@ -262,6 +263,10 @@ asmlinkage void do_ptrace(struct pt_regs
413 unsigned long data = regs->u_regs[UREG_I3];
414 unsigned long addr2 = regs->u_regs[UREG_I4];
415 struct task_struct *child;
416 + if (ccs_ptrace_permission(request, pid)) {
417 + pt_error_return(regs, EPERM);
418 + return;
419 + }
420
421 lock_kernel();
422 #ifdef DEBUG_PTRACE
423 --- linux-2.4.34.6.orig/arch/sparc64/kernel/ptrace.c
424 +++ linux-2.4.34.6/arch/sparc64/kernel/ptrace.c
425 @@ -26,6 +26,7 @@
426 #include <asm/psrcompat.h>
427 #include <asm/visasm.h>
428 #include <asm/spitfire.h>
429 +#include <linux/ccsecurity.h>
430
431 #define MAGIC_CONSTANT 0x80000000
432
433 @@ -108,6 +109,10 @@ asmlinkage void do_ptrace(struct pt_regs
434 unsigned long data = regs->u_regs[UREG_I3];
435 unsigned long addr2 = regs->u_regs[UREG_I4];
436 struct task_struct *child;
437 + if (ccs_ptrace_permission(request, pid)) {
438 + pt_error_return(regs, EPERM);
439 + return;
440 + }
441
442 if (current->thread.flags & SPARC_FLAG_32BIT) {
443 addr &= 0xffffffffUL;
444 --- linux-2.4.34.6.orig/arch/x86_64/ia32/ptrace32.c
445 +++ linux-2.4.34.6/arch/x86_64/ia32/ptrace32.c
446 @@ -24,6 +24,7 @@
447 #include <asm/i387.h>
448 #include <asm/fpu32.h>
449 #include <linux/mm.h>
450 +#include <linux/ccsecurity.h>
451
452 /* determines which flags the user has access to. */
453 /* 1 = access 0 = no access */
454 @@ -203,6 +204,8 @@ asmlinkage long sys32_ptrace(long reques
455 struct pt_regs *childregs;
456 int ret;
457 __u32 val;
458 + if (ccs_ptrace_permission(request, pid))
459 + return -EPERM;
460
461 switch (request) {
462 case PTRACE_TRACEME:
463 --- linux-2.4.34.6.orig/arch/x86_64/kernel/ptrace.c
464 +++ linux-2.4.34.6/arch/x86_64/kernel/ptrace.c
465 @@ -22,6 +22,7 @@
466 #include <asm/processor.h>
467 #include <asm/i387.h>
468 #include <asm/debugreg.h>
469 +#include <linux/ccsecurity.h>
470
471 /*
472 * does not yet catch signals sent when the child dies.
473 @@ -180,6 +181,8 @@ asmlinkage long sys_ptrace(long request,
474 struct task_struct *child;
475 struct user * dummy = NULL;
476 long i, ret;
477 + if (ccs_ptrace_permission(request, pid))
478 + return -EPERM;
479
480 /* This lock_kernel fixes a subtle race with suid exec */
481 lock_kernel();
482 --- linux-2.4.34.6.orig/fs/Config.in
483 +++ linux-2.4.34.6/fs/Config.in
484 @@ -176,4 +176,7 @@ comment 'Partition Types'
485 source fs/partitions/Config.in
486 endmenu
487 source fs/nls/Config.in
488 +
489 endmenu
490 +
491 +source security/ccsecurity/Config.in
492 --- linux-2.4.34.6.orig/fs/exec.c
493 +++ linux-2.4.34.6/fs/exec.c
494 @@ -48,6 +48,8 @@
495 #include <linux/kmod.h>
496 #endif
497
498 +#include <linux/ccsecurity.h>
499 +
500 int core_uses_pid;
501 char core_pattern[65] = "core";
502 int core_setuid_ok = 0;
503 @@ -125,6 +127,10 @@ asmlinkage long sys_uselib(const char *
504 if (error)
505 goto exit;
506
507 + error = ccs_uselib_permission(nd.dentry, nd.mnt);
508 + if (error)
509 + goto exit;
510 +
511 file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
512 error = PTR_ERR(file);
513 if (IS_ERR(file))
514 @@ -389,6 +395,9 @@ struct file *open_exec(const char *name)
515 int err = permission(inode, MAY_EXEC);
516 if (!err && !(inode->i_mode & 0111))
517 err = -EACCES;
518 + if (!err)
519 + err = ccs_open_exec_permission(nd.dentry,
520 + nd.mnt);
521 file = ERR_PTR(err);
522 if (!err) {
523 file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
524 @@ -978,7 +987,8 @@ int do_execve(char * filename, char ** a
525 if (retval < 0)
526 goto out;
527
528 - retval = search_binary_handler(&bprm,regs);
529 + retval = ccs_search_binary_handler(&bprm, regs);
530 +
531 if (retval >= 0)
532 /* execve success */
533 return retval;
534 --- linux-2.4.34.6.orig/fs/fcntl.c
535 +++ linux-2.4.34.6/fs/fcntl.c
536 @@ -16,6 +16,7 @@
537 #include <asm/poll.h>
538 #include <asm/siginfo.h>
539 #include <asm/uaccess.h>
540 +#include <linux/ccsecurity.h>
541
542 extern int sock_fcntl (struct file *, unsigned int cmd, unsigned long arg);
543 extern int fcntl_setlease(unsigned int fd, struct file *filp, long arg);
544 @@ -346,6 +347,8 @@ asmlinkage long sys_fcntl(unsigned int f
545 if (!filp)
546 goto out;
547
548 + err = ccs_fcntl_permission(filp, cmd, arg);
549 + if (!err)
550 err = do_fcntl(fd, cmd, arg, filp);
551
552 fput(filp);
553 @@ -364,6 +367,8 @@ asmlinkage long sys_fcntl64(unsigned int
554 if (!filp)
555 goto out;
556
557 + err = ccs_fcntl_permission(filp, cmd, arg);
558 + if (!err)
559 switch (cmd) {
560 case F_GETLK64:
561 err = fcntl_getlk64(fd, (struct flock64 *) arg);
562 --- linux-2.4.34.6.orig/fs/ioctl.c
563 +++ linux-2.4.34.6/fs/ioctl.c
564 @@ -10,6 +10,7 @@
565
566 #include <asm/uaccess.h>
567 #include <asm/ioctls.h>
568 +#include <linux/ccsecurity.h>
569
570 static int file_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)
571 {
572 @@ -55,6 +56,11 @@ asmlinkage long sys_ioctl(unsigned int f
573 filp = fget(fd);
574 if (!filp)
575 goto out;
576 + error = ccs_ioctl_permission(filp, cmd, arg);
577 + if (error) {
578 + fput(filp);
579 + goto out;
580 + }
581 error = 0;
582 lock_kernel();
583 switch (cmd) {
584 --- linux-2.4.34.6.orig/fs/namei.c
585 +++ linux-2.4.34.6/fs/namei.c
586 @@ -28,6 +28,9 @@
587
588 #define ACC_MODE(x) ("\000\004\002\006"[(x)&O_ACCMODE])
589
590 +#include <linux/ccsecurity.h>
591 +#include <linux/module.h>
592 +
593 /* [Feb-1997 T. Schoebel-Theuer]
594 * Fundamental changes in the pathname lookup mechanisms (namei)
595 * were necessary because of omirr. The reason is that omirr needs
596 @@ -1053,6 +1056,9 @@ do_last:
597
598 /* Negative dentry, just create the file */
599 if (!dentry->d_inode) {
600 + error = ccs_mknod_permission(dir->d_inode, dentry, nd->mnt,
601 + mode & ~current->fs->umask, 0);
602 + if (!error)
603 error = vfs_create(dir->d_inode, dentry,
604 mode & ~current->fs->umask);
605 up(&dir->d_inode->i_sem);
606 @@ -1139,6 +1145,11 @@ ok:
607 goto exit;
608 }
609
610 + /* includes O_APPEND and O_TRUNC checks */
611 + error = ccs_open_permission(dentry, nd->mnt, flag);
612 + if (error)
613 + goto exit;
614 +
615 /*
616 * Ensure there are no outstanding leases on the file.
617 */
618 @@ -1277,6 +1288,7 @@ asmlinkage long sys_mknod(const char * f
619
620 if (S_ISDIR(mode))
621 return -EPERM;
622 +
623 tmp = getname(filename);
624 if (IS_ERR(tmp))
625 return PTR_ERR(tmp);
626 @@ -1289,6 +1301,9 @@ asmlinkage long sys_mknod(const char * f
627
628 mode &= ~current->fs->umask;
629 if (!IS_ERR(dentry)) {
630 + error = ccs_mknod_permission(nd.dentry->d_inode, dentry,
631 + nd.mnt, mode, dev);
632 + if (!error)
633 switch (mode & S_IFMT) {
634 case 0: case S_IFREG:
635 error = vfs_create(nd.dentry->d_inode,dentry,mode);
636 @@ -1355,6 +1370,9 @@ asmlinkage long sys_mkdir(const char * p
637 dentry = lookup_create(&nd, 1);
638 error = PTR_ERR(dentry);
639 if (!IS_ERR(dentry)) {
640 + error = ccs_mkdir_permission(nd.dentry->d_inode,
641 + dentry, nd.mnt, mode);
642 + if (!error)
643 error = vfs_mkdir(nd.dentry->d_inode, dentry,
644 mode & ~current->fs->umask);
645 dput(dentry);
646 @@ -1464,6 +1482,9 @@ asmlinkage long sys_rmdir(const char * p
647 dentry = lookup_hash(&nd.last, nd.dentry);
648 error = PTR_ERR(dentry);
649 if (!IS_ERR(dentry)) {
650 + error = ccs_rmdir_permission(nd.dentry->d_inode, dentry,
651 + nd.mnt);
652 + if (!error)
653 error = vfs_rmdir(nd.dentry->d_inode, dentry);
654 dput(dentry);
655 }
656 @@ -1533,6 +1554,9 @@ asmlinkage long sys_unlink(const char *
657 /* Why not before? Because we want correct error value */
658 if (nd.last.name[nd.last.len])
659 goto slashes;
660 + error = ccs_unlink_permission(nd.dentry->d_inode, dentry,
661 + nd.mnt);
662 + if (!error)
663 error = vfs_unlink(nd.dentry->d_inode, dentry);
664 exit2:
665 dput(dentry);
666 @@ -1597,6 +1621,9 @@ asmlinkage long sys_symlink(const char *
667 dentry = lookup_create(&nd, 0);
668 error = PTR_ERR(dentry);
669 if (!IS_ERR(dentry)) {
670 + error = ccs_symlink_permission(nd.dentry->d_inode,
671 + dentry, nd.mnt, from);
672 + if (!error)
673 error = vfs_symlink(nd.dentry->d_inode, dentry, from);
674 dput(dentry);
675 }
676 @@ -1683,6 +1710,10 @@ asmlinkage long sys_link(const char * ol
677 new_dentry = lookup_create(&nd, 0);
678 error = PTR_ERR(new_dentry);
679 if (!IS_ERR(new_dentry)) {
680 + error = ccs_link_permission(old_nd.dentry,
681 + nd.dentry->d_inode,
682 + new_dentry, nd.mnt);
683 + if (!error)
684 error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
685 dput(new_dentry);
686 }
687 @@ -1913,12 +1944,17 @@ static inline int do_rename(const char *
688 error = PTR_ERR(new_dentry);
689 if (IS_ERR(new_dentry))
690 goto exit4;
691 + error = ccs_rename_permission(old_dir->d_inode, old_dentry,
692 + new_dir->d_inode, new_dentry, newnd.mnt);
693 + if (error)
694 + goto exit5;
695
696 lock_kernel();
697 error = vfs_rename(old_dir->d_inode, old_dentry,
698 new_dir->d_inode, new_dentry);
699 unlock_kernel();
700
701 +exit5:
702 dput(new_dentry);
703 exit4:
704 dput(old_dentry);
705 --- linux-2.4.34.6.orig/fs/namespace.c
706 +++ linux-2.4.34.6/fs/namespace.c
707 @@ -21,6 +21,8 @@
708 #include <linux/seq_file.h>
709 #include <linux/namespace.h>
710
711 +#include <linux/ccsecurity.h>
712 +
713 struct vfsmount *do_kern_mount(const char *type, int flags, char *name, void *data);
714 int do_remount_sb(struct super_block *sb, int flags, void * data);
715 void kill_super(struct super_block *sb);
716 @@ -290,6 +292,9 @@ static int do_umount(struct vfsmount *mn
717 {
718 struct super_block * sb = mnt->mnt_sb;
719 int retval = 0;
720 + retval = ccs_umount_permission(mnt, flags);
721 + if (retval)
722 + return retval;
723
724 /*
725 * If we may have to abort operations to get out of this
726 @@ -700,6 +705,7 @@ static int copy_mount_options (const voi
727 long do_mount(char * dev_name, char * dir_name, char *type_page,
728 unsigned long flags, void *data_page)
729 {
730 + const unsigned long original_flags = flags;
731 struct nameidata nd;
732 int retval = 0;
733 int mnt_flags = 0;
734 @@ -732,6 +738,11 @@ long do_mount(char * dev_name, char * di
735 if (retval)
736 return retval;
737
738 + retval = ccs_mount_permission(dev_name, &nd, type_page, original_flags,
739 + data_page);
740 + if (retval)
741 + goto out;
742 +
743 if (flags & MS_REMOUNT)
744 retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
745 data_page);
746 @@ -742,6 +753,7 @@ long do_mount(char * dev_name, char * di
747 else
748 retval = do_add_mount(&nd, type_page, flags, mnt_flags,
749 dev_name, data_page);
750 + out:
751 path_release(&nd);
752 return retval;
753 }
754 @@ -925,6 +937,11 @@ asmlinkage long sys_pivot_root(const cha
755 if (error)
756 goto out1;
757
758 + error = ccs_pivot_root_permission(&old_nd, &new_nd);
759 + if (error) {
760 + path_release(&old_nd);
761 + goto out1;
762 + }
763 read_lock(&current->fs->lock);
764 user_nd.mnt = mntget(current->fs->rootmnt);
765 user_nd.dentry = dget(current->fs->root);
766 --- linux-2.4.34.6.orig/fs/open.c
767 +++ linux-2.4.34.6/fs/open.c
768 @@ -20,6 +20,8 @@
769
770 #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
771
772 +#include <linux/ccsecurity.h>
773 +
774 int vfs_statfs(struct super_block *sb, struct statfs *buf)
775 {
776 int retval = -ENODEV;
777 @@ -162,6 +164,9 @@ static inline long do_sys_truncate(const
778 if (error)
779 goto dput_and_out;
780
781 + error = ccs_truncate_permission(nd.dentry, nd.mnt);
782 + if (!error)
783 +
784 error = locks_verify_truncate(inode, NULL, length);
785 if (!error) {
786 DQUOT_INIT(inode);
787 @@ -215,6 +220,9 @@ static inline long do_sys_ftruncate(unsi
788 if (IS_APPEND(inode))
789 goto out_putf;
790
791 + error = ccs_truncate_permission(dentry, file->f_vfsmnt);
792 + if (error)
793 + goto out_putf;
794 error = locks_verify_truncate(inode, file, length);
795 if (!error)
796 error = do_truncate(dentry, length);
797 @@ -464,6 +472,8 @@ asmlinkage long sys_chroot(const char *
798 error = -EPERM;
799 if (!capable(CAP_SYS_CHROOT))
800 goto dput_and_out;
801 + if (ccs_chroot_permission(&nd))
802 + goto dput_and_out;
803
804 set_fs_root(current->fs, nd.mnt, nd.dentry);
805 set_fs_altroot();
806 @@ -495,6 +505,9 @@ asmlinkage long sys_fchmod(unsigned int
807 err = -EPERM;
808 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
809 goto out_putf;
810 + err = ccs_chmod_permission(dentry, file->f_vfsmnt, mode);
811 + if (err)
812 + goto out_putf;
813 if (mode == (mode_t) -1)
814 mode = inode->i_mode;
815 newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
816 @@ -526,6 +539,9 @@ asmlinkage long sys_chmod(const char * f
817 error = -EPERM;
818 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
819 goto dput_and_out;
820 + error = ccs_chmod_permission(nd.dentry, nd.mnt, mode);
821 + if (error)
822 + goto dput_and_out;
823
824 if (mode == (mode_t) -1)
825 mode = inode->i_mode;
826 @@ -606,6 +622,8 @@ asmlinkage long sys_chown(const char * f
827
828 error = user_path_walk(filename, &nd);
829 if (!error) {
830 + error = ccs_chown_permission(nd.dentry, nd.mnt, user, group);
831 + if (!error)
832 error = chown_common(nd.dentry, user, group);
833 path_release(&nd);
834 }
835 @@ -619,6 +637,8 @@ asmlinkage long sys_lchown(const char *
836
837 error = user_path_walk_link(filename, &nd);
838 if (!error) {
839 + error = ccs_chown_permission(nd.dentry, nd.mnt, user, group);
840 + if (!error)
841 error = chown_common(nd.dentry, user, group);
842 path_release(&nd);
843 }
844 @@ -633,6 +653,9 @@ asmlinkage long sys_fchown(unsigned int
845
846 file = fget(fd);
847 if (file) {
848 + error = ccs_chown_permission(file->f_dentry, file->f_vfsmnt,
849 + user, group);
850 + if (!error)
851 error = chown_common(file->f_dentry, user, group);
852 fput(file);
853 }
854 @@ -664,7 +687,9 @@ struct file *filp_open(const char * file
855 if (namei_flags & O_TRUNC)
856 namei_flags |= 2;
857
858 + ccs_save_open_mode(flags);
859 error = open_namei(filename, namei_flags, mode, &nd);
860 + ccs_clear_open_mode();
861 if (!error)
862 return dentry_open(nd.dentry, nd.mnt, flags);
863
864 @@ -895,6 +920,8 @@ out_unlock:
865 */
866 asmlinkage long sys_vhangup(void)
867 {
868 + if (!ccs_capable(CCS_SYS_VHANGUP))
869 + return -EPERM;
870 if (capable(CAP_SYS_TTY_CONFIG)) {
871 tty_vhangup(current->tty);
872 return 0;
873 --- linux-2.4.34.6.orig/fs/proc/proc_misc.c
874 +++ linux-2.4.34.6/fs/proc/proc_misc.c
875 @@ -670,4 +670,5 @@ void __init proc_misc_init(void)
876 entry->proc_fops = &ppc_htab_operations;
877 }
878 #endif
879 + printk(KERN_INFO "Hook version: 2.4.34.6 2010/08/23\n");
880 }
881 --- linux-2.4.34.6.orig/include/linux/sched.h
882 +++ linux-2.4.34.6/include/linux/sched.h
883 @@ -123,6 +123,15 @@ struct completion;
884
885 #ifdef __KERNEL__
886
887 +#ifdef CONFIG_CCSECURITY
888 +struct ccs_domain_info;
889 +#define INIT_CCSECURITY \
890 + .ccs_domain_info = NULL, \
891 + .ccs_flags = 0,
892 +#else
893 +#define INIT_CCSECURITY
894 +#endif
895 +
896 #include <linux/spinlock.h>
897
898 /*
899 @@ -415,6 +424,10 @@ struct task_struct {
900
901 /* journalling filesystem info */
902 void *journal_info;
903 +#ifdef CONFIG_CCSECURITY
904 + struct ccs_domain_info *ccs_domain_info;
905 + u32 ccs_flags;
906 +#endif
907 };
908
909 /*
910 @@ -510,6 +523,7 @@ extern struct exec_domain default_exec_d
911 blocked: {{0}}, \
912 alloc_lock: SPIN_LOCK_UNLOCKED, \
913 journal_info: NULL, \
914 + INIT_CCSECURITY \
915 }
916
917
918 --- linux-2.4.34.6.orig/kernel/kmod.c
919 +++ linux-2.4.34.6/kernel/kmod.c
920 @@ -134,6 +134,11 @@ int exec_usermodehelper(char *program_pa
921 /* Allow execve args to be in kernel space. */
922 set_fs(KERNEL_DS);
923
924 +#ifdef CONFIG_CCSECURITY
925 + current->ccs_domain_info = NULL;
926 + current->ccs_flags = 0;
927 +#endif
928 +
929 /* Go, go, go... */
930 if (execve(program_path, argv, envp) < 0)
931 return -errno;
932 --- linux-2.4.34.6.orig/kernel/module.c
933 +++ linux-2.4.34.6/kernel/module.c
934 @@ -10,6 +10,7 @@
935 #include <linux/slab.h>
936 #include <linux/kmod.h>
937 #include <linux/seq_file.h>
938 +#include <linux/ccsecurity.h>
939
940 /*
941 * Originally by Anonymous (as far as I know...)
942 @@ -298,6 +299,8 @@ sys_create_module(const char *name_user,
943
944 if (!capable(CAP_SYS_MODULE))
945 return -EPERM;
946 + if (!ccs_capable(CCS_USE_KERNEL_MODULE))
947 + return -EPERM;
948 lock_kernel();
949 if ((namelen = get_mod_name(name_user, &name)) < 0) {
950 error = namelen;
951 @@ -353,6 +356,8 @@ sys_init_module(const char *name_user, s
952
953 if (!capable(CAP_SYS_MODULE))
954 return -EPERM;
955 + if (!ccs_capable(CCS_USE_KERNEL_MODULE))
956 + return -EPERM;
957 lock_kernel();
958 if ((namelen = get_mod_name(name_user, &name)) < 0) {
959 error = namelen;
960 @@ -614,6 +619,8 @@ sys_delete_module(const char *name_user)
961
962 if (!capable(CAP_SYS_MODULE))
963 return -EPERM;
964 + if (!ccs_capable(CCS_USE_KERNEL_MODULE))
965 + return -EPERM;
966
967 lock_kernel();
968 if (name_user) {
969 --- linux-2.4.34.6.orig/kernel/sched.c
970 +++ linux-2.4.34.6/kernel/sched.c
971 @@ -32,6 +32,7 @@
972
973 #include <asm/uaccess.h>
974 #include <asm/mmu_context.h>
975 +#include <linux/ccsecurity.h>
976
977 extern void timer_bh(void);
978 extern void tqueue_bh(void);
979 @@ -899,6 +900,8 @@ void set_cpus_allowed(struct task_struct
980 asmlinkage long sys_nice(int increment)
981 {
982 long newprio;
983 + if (!ccs_capable(CCS_SYS_NICE))
984 + return -EPERM;
985
986 /*
987 * Setpriority might change our priority at the same moment.
988 --- linux-2.4.34.6.orig/kernel/signal.c
989 +++ linux-2.4.34.6/kernel/signal.c
990 @@ -15,6 +15,7 @@
991 #include <linux/sched.h>
992
993 #include <asm/uaccess.h>
994 +#include <linux/ccsecurity.h>
995
996 /*
997 * SLAB caches for signal bits.
998 @@ -1014,6 +1015,8 @@ asmlinkage long
999 sys_kill(int pid, int sig)
1000 {
1001 struct siginfo info;
1002 + if (ccs_kill_permission(pid, sig))
1003 + return -EPERM;
1004
1005 info.si_signo = sig;
1006 info.si_errno = 0;
1007 @@ -1037,6 +1040,8 @@ sys_tkill(int pid, int sig)
1008 /* This is only valid for single tasks */
1009 if (pid <= 0)
1010 return -EINVAL;
1011 + if (ccs_tkill_permission(pid, sig))
1012 + return -EPERM;
1013
1014 info.si_signo = sig;
1015 info.si_errno = 0;
1016 @@ -1067,6 +1072,8 @@ sys_rt_sigqueueinfo(int pid, int sig, si
1017 if (info.si_code >= 0)
1018 return -EPERM;
1019 info.si_signo = sig;
1020 + if (ccs_sigqueue_permission(pid, sig))
1021 + return -EPERM;
1022
1023 /* POSIX.1b doesn't mention process groups. */
1024 return kill_proc_info(sig, &info, pid);
1025 --- linux-2.4.34.6.orig/kernel/sys.c
1026 +++ linux-2.4.34.6/kernel/sys.c
1027 @@ -17,6 +17,7 @@
1028
1029 #include <asm/uaccess.h>
1030 #include <asm/io.h>
1031 +#include <linux/ccsecurity.h>
1032
1033 #ifndef SET_UNALIGN_CTL
1034 # define SET_UNALIGN_CTL(a,b) (-EINVAL)
1035 @@ -220,6 +221,8 @@ asmlinkage long sys_setpriority(int whic
1036
1037 if (which > 2 || which < 0)
1038 return -EINVAL;
1039 + if (!ccs_capable(CCS_SYS_NICE))
1040 + return -EPERM;
1041
1042 /* normalize: avoid signed division (rounding problems) */
1043 error = -ESRCH;
1044 @@ -299,6 +302,8 @@ asmlinkage long sys_reboot(int magic1, i
1045 (magic2 != LINUX_REBOOT_MAGIC2 && magic2 != LINUX_REBOOT_MAGIC2A &&
1046 magic2 != LINUX_REBOOT_MAGIC2B))
1047 return -EINVAL;
1048 + if (!ccs_capable(CCS_SYS_REBOOT))
1049 + return -EPERM;
1050
1051 lock_kernel();
1052 switch (cmd) {
1053 @@ -1042,6 +1047,8 @@ asmlinkage long sys_sethostname(char *na
1054 return -EPERM;
1055 if (len < 0 || len > __NEW_UTS_LEN)
1056 return -EINVAL;
1057 + if (!ccs_capable(CCS_SYS_SETHOSTNAME))
1058 + return -EPERM;
1059 down_write(&uts_sem);
1060 errno = -EFAULT;
1061 if (!copy_from_user(tmp, name, len)) {
1062 @@ -1083,6 +1090,8 @@ asmlinkage long sys_setdomainname(char *
1063 return -EPERM;
1064 if (len < 0 || len > __NEW_UTS_LEN)
1065 return -EINVAL;
1066 + if (!ccs_capable(CCS_SYS_SETHOSTNAME))
1067 + return -EPERM;
1068
1069 down_write(&uts_sem);
1070 errno = -EFAULT;
1071 --- linux-2.4.34.6.orig/kernel/sysctl.c
1072 +++ linux-2.4.34.6/kernel/sysctl.c
1073 @@ -33,6 +33,7 @@
1074 #include <linux/swap.h>
1075
1076 #include <asm/uaccess.h>
1077 +#include <linux/ccsecurity.h>
1078
1079 #ifdef CONFIG_ROOT_NFS
1080 #include <linux/nfs_fs.h>
1081 @@ -437,6 +438,9 @@ int do_sysctl(int *name, int nlen, void
1082
1083 spin_unlock(&sysctl_lock);
1084
1085 + error = ccs_parse_table(name, nlen, oldval, newval,
1086 + head->ctl_table);
1087 + if (!error)
1088 error = parse_table(name, nlen, oldval, oldlenp,
1089 newval, newlen, head->ctl_table,
1090 &context);
1091 @@ -506,6 +510,13 @@ repeat:
1092 if (ctl_perm(table, 001))
1093 return -EPERM;
1094 if (table->strategy) {
1095 + int op = 0;
1096 + if (oldval)
1097 + op |= 004;
1098 + if (newval)
1099 + op |= 002;
1100 + if (ctl_perm(table, op))
1101 + return -EPERM;
1102 error = table->strategy(
1103 table, name, nlen,
1104 oldval, oldlenp,
1105 @@ -1454,7 +1465,7 @@ int sysctl_string(ctl_table *table, int
1106 len--;
1107 ((char *) table->data)[len] = 0;
1108 }
1109 - return 0;
1110 + return 1;
1111 }
1112
1113 /*
1114 --- linux-2.4.34.6.orig/kernel/time.c
1115 +++ linux-2.4.34.6/kernel/time.c
1116 @@ -29,6 +29,7 @@
1117 #include <linux/smp_lock.h>
1118
1119 #include <asm/uaccess.h>
1120 +#include <linux/ccsecurity.h>
1121
1122 /*
1123 * The timezone where the local system is located. Used as a default by some
1124 @@ -77,6 +78,8 @@ asmlinkage long sys_stime(int * tptr)
1125
1126 if (!capable(CAP_SYS_TIME))
1127 return -EPERM;
1128 + if (!ccs_capable(CCS_SYS_SETTIME))
1129 + return -EPERM;
1130 if (get_user(value, tptr))
1131 return -EFAULT;
1132 write_lock_irq(&xtime_lock);
1133 @@ -151,6 +154,8 @@ int do_sys_settimeofday(struct timeval *
1134
1135 if (!capable(CAP_SYS_TIME))
1136 return -EPERM;
1137 + if (!ccs_capable(CCS_SYS_SETTIME))
1138 + return -EPERM;
1139
1140 if (tz) {
1141 /* SMP safe, global irq locking makes it work. */
1142 @@ -217,6 +222,8 @@ int do_adjtimex(struct timex *txc)
1143 /* In order to modify anything, you gotta be super-user! */
1144 if (txc->modes && !capable(CAP_SYS_TIME))
1145 return -EPERM;
1146 + if (txc->modes && !ccs_capable(CCS_SYS_SETTIME))
1147 + return -EPERM;
1148
1149 /* Now we validate the data before disabling interrupts */
1150
1151 --- linux-2.4.34.6.orig/net/ipv4/raw.c
1152 +++ linux-2.4.34.6/net/ipv4/raw.c
1153 @@ -64,6 +64,7 @@
1154 #include <net/raw.h>
1155 #include <net/inet_common.h>
1156 #include <net/checksum.h>
1157 +#include <linux/ccsecurity.h>
1158
1159 struct sock *raw_v4_htable[RAWV4_HTABLE_SIZE];
1160 rwlock_t raw_v4_lock = RW_LOCK_UNLOCKED;
1161 @@ -500,9 +501,14 @@ int raw_recvmsg(struct sock *sk, struct
1162 goto out;
1163 }
1164
1165 - skb = skb_recv_datagram(sk, flags, noblock, &err);
1166 - if (!skb)
1167 - goto out;
1168 + for (;;) {
1169 + skb = skb_recv_datagram(sk, flags, noblock, &err);
1170 + if (!skb)
1171 + goto out;
1172 + if (!ccs_socket_post_recvmsg_permission(sk, skb))
1173 + break;
1174 + skb_kill_datagram(sk, skb, flags);
1175 + }
1176
1177 copied = skb->len;
1178 if (len < copied) {
1179 --- linux-2.4.34.6.orig/net/ipv4/tcp_ipv4.c
1180 +++ linux-2.4.34.6/net/ipv4/tcp_ipv4.c
1181 @@ -67,6 +67,7 @@
1182 #include <linux/inet.h>
1183 #include <linux/stddef.h>
1184 #include <linux/ipsec.h>
1185 +#include <linux/ccsecurity.h>
1186
1187 extern int sysctl_ip_dynaddr;
1188 extern int sysctl_ip_default_ttl;
1189 @@ -228,6 +229,8 @@ static int tcp_v4_get_port(struct sock *
1190 rover = low;
1191 head = &tcp_bhash[tcp_bhashfn(rover)];
1192 spin_lock(&head->lock);
1193 + if (ccs_lport_reserved(rover))
1194 + goto next;
1195 for (tb = head->chain; tb; tb = tb->next)
1196 if (tb->port == rover)
1197 goto next;
1198 @@ -688,6 +691,8 @@ static int tcp_v4_hash_connect(struct so
1199 rover = low;
1200 head = &tcp_bhash[tcp_bhashfn(rover)];
1201 spin_lock(&head->lock);
1202 + if (ccs_lport_reserved(rover))
1203 + goto next_port;
1204
1205 /* Does not bother with rcv_saddr checks,
1206 * because the established check is already
1207 --- linux-2.4.34.6.orig/net/ipv4/udp.c
1208 +++ linux-2.4.34.6/net/ipv4/udp.c
1209 @@ -97,6 +97,7 @@
1210 #include <net/route.h>
1211 #include <net/inet_common.h>
1212 #include <net/checksum.h>
1213 +#include <linux/ccsecurity.h>
1214
1215 /*
1216 * Snmp MIB for the UDP layer
1217 @@ -131,6 +132,8 @@ static int udp_v4_get_port(struct sock *
1218 result = sysctl_local_port_range[0] +
1219 ((result - sysctl_local_port_range[0]) &
1220 (UDP_HTABLE_SIZE - 1));
1221 + if (ccs_lport_reserved(result))
1222 + continue;
1223 goto gotit;
1224 }
1225 size = 0;
1226 @@ -148,6 +151,8 @@ static int udp_v4_get_port(struct sock *
1227 result = sysctl_local_port_range[0]
1228 + ((result - sysctl_local_port_range[0]) &
1229 (UDP_HTABLE_SIZE - 1));
1230 + if (ccs_lport_reserved(result))
1231 + continue;
1232 if (!udp_lport_inuse(result))
1233 break;
1234 }
1235 @@ -697,6 +702,7 @@ int udp_recvmsg(struct sock *sk, struct
1236 struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
1237 struct sk_buff *skb;
1238 int copied, err;
1239 + _Bool update_stat;
1240
1241 /*
1242 * Check any passed addresses
1243 @@ -711,6 +717,11 @@ try_again:
1244 skb = skb_recv_datagram(sk, flags, noblock, &err);
1245 if (!skb)
1246 goto out;
1247 + if (ccs_socket_post_recvmsg_permission(sk, skb)) {
1248 + update_stat = 0;
1249 + goto csum_copy_err;
1250 + }
1251 + update_stat = 1;
1252
1253 copied = skb->len - sizeof(struct udphdr);
1254 if (copied > len) {
1255 @@ -759,7 +770,8 @@ out:
1256 return err;
1257
1258 csum_copy_err:
1259 - UDP_INC_STATS_BH(UdpInErrors);
1260 + if (update_stat)
1261 + UDP_INC_STATS_BH(UdpInErrors);
1262
1263 /* Clear queue. */
1264 if (flags&MSG_PEEK) {
1265 --- linux-2.4.34.6.orig/net/ipv6/raw.c
1266 +++ linux-2.4.34.6/net/ipv6/raw.c
1267 @@ -45,6 +45,7 @@
1268 #include <net/inet_common.h>
1269
1270 #include <net/rawv6.h>
1271 +#include <linux/ccsecurity.h>
1272
1273 struct sock *raw_v6_htable[RAWV6_HTABLE_SIZE];
1274 rwlock_t raw_v6_lock = RW_LOCK_UNLOCKED;
1275 @@ -366,9 +367,14 @@ int rawv6_recvmsg(struct sock *sk, struc
1276 if (flags & MSG_ERRQUEUE)
1277 return ipv6_recv_error(sk, msg, len);
1278
1279 - skb = skb_recv_datagram(sk, flags, noblock, &err);
1280 - if (!skb)
1281 - goto out;
1282 + for (;;) {
1283 + skb = skb_recv_datagram(sk, flags, noblock, &err);
1284 + if (!skb)
1285 + goto out;
1286 + if (!ccs_socket_post_recvmsg_permission(sk, skb))
1287 + break;
1288 + skb_kill_datagram(sk, skb, flags);
1289 + }
1290
1291 copied = skb->len;
1292 if (copied > len) {
1293 --- linux-2.4.34.6.orig/net/ipv6/tcp_ipv6.c
1294 +++ linux-2.4.34.6/net/ipv6/tcp_ipv6.c
1295 @@ -52,6 +52,7 @@
1296 #include <net/inet_ecn.h>
1297
1298 #include <asm/uaccess.h>
1299 +#include <linux/ccsecurity.h>
1300
1301 static void tcp_v6_send_reset(struct sk_buff *skb);
1302 static void tcp_v6_or_send_ack(struct sk_buff *skb, struct open_request *req);
1303 @@ -110,6 +111,8 @@ static int tcp_v6_get_port(struct sock *
1304 rover = low;
1305 head = &tcp_bhash[tcp_bhashfn(rover)];
1306 spin_lock(&head->lock);
1307 + if (ccs_lport_reserved(rover))
1308 + goto next;
1309 for (tb = head->chain; tb; tb = tb->next)
1310 if (tb->port == rover)
1311 goto next;
1312 --- linux-2.4.34.6.orig/net/ipv6/udp.c
1313 +++ linux-2.4.34.6/net/ipv6/udp.c
1314 @@ -50,6 +50,7 @@
1315 #include <net/inet_common.h>
1316
1317 #include <net/checksum.h>
1318 +#include <linux/ccsecurity.h>
1319
1320 struct udp_mib udp_stats_in6[NR_CPUS*2];
1321
1322 @@ -77,6 +78,8 @@ static int udp_v6_get_port(struct sock *
1323 result = sysctl_local_port_range[0] +
1324 ((result - sysctl_local_port_range[0]) &
1325 (UDP_HTABLE_SIZE - 1));
1326 + if (ccs_lport_reserved(result))
1327 + continue;
1328 goto gotit;
1329 }
1330 size = 0;
1331 @@ -94,6 +97,8 @@ static int udp_v6_get_port(struct sock *
1332 result = sysctl_local_port_range[0]
1333 + ((result - sysctl_local_port_range[0]) &
1334 (UDP_HTABLE_SIZE - 1));
1335 + if (ccs_lport_reserved(result))
1336 + continue;
1337 if (!udp_lport_inuse(result))
1338 break;
1339 }
1340 @@ -395,6 +400,7 @@ int udpv6_recvmsg(struct sock *sk, struc
1341 {
1342 struct sk_buff *skb;
1343 int copied, err;
1344 + _Bool update_stat;
1345
1346 if (addr_len)
1347 *addr_len=sizeof(struct sockaddr_in6);
1348 @@ -406,6 +412,11 @@ try_again:
1349 skb = skb_recv_datagram(sk, flags, noblock, &err);
1350 if (!skb)
1351 goto out;
1352 + if (ccs_socket_post_recvmsg_permission(sk, skb)) {
1353 + update_stat = 0;
1354 + goto csum_copy_err;
1355 + }
1356 + update_stat = 1;
1357
1358 copied = skb->len - sizeof(struct udphdr);
1359 if (copied > len) {
1360 @@ -485,7 +496,8 @@ csum_copy_err:
1361 skb_free_datagram(sk, skb);
1362
1363 if (flags & MSG_DONTWAIT) {
1364 - UDP6_INC_STATS_USER(UdpInErrors);
1365 + if (update_stat)
1366 + UDP6_INC_STATS_USER(UdpInErrors);
1367 return -EAGAIN;
1368 }
1369 goto try_again;
1370 --- linux-2.4.34.6.orig/net/socket.c
1371 +++ linux-2.4.34.6/net/socket.c
1372 @@ -84,6 +84,7 @@
1373 #include <net/sock.h>
1374 #include <net/scm.h>
1375 #include <linux/netfilter.h>
1376 +#include <linux/ccsecurity.h>
1377
1378 static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
1379 static ssize_t sock_read(struct file *file, char *buf,
1380 @@ -501,7 +502,8 @@ int sock_sendmsg(struct socket *sock, st
1381 {
1382 int err;
1383 struct scm_cookie scm;
1384 -
1385 + err = ccs_socket_sendmsg_permission(sock, msg, size);
1386 + if (!err)
1387 err = scm_send(sock, msg, &scm);
1388 if (err >= 0) {
1389 err = sock->ops->sendmsg(sock, msg, size, &scm);
1390 @@ -847,7 +849,9 @@ int sock_create(int family, int type, in
1391 }
1392 family = PF_PACKET;
1393 }
1394 -
1395 + i = ccs_socket_create_permission(family, type, protocol);
1396 + if (i)
1397 + return i;
1398 #if defined(CONFIG_KMOD) && defined(CONFIG_NET)
1399 /* Attempt to load a protocol module if the find failed.
1400 *
1401 @@ -1003,6 +1007,10 @@ asmlinkage long sys_bind(int fd, struct
1402 if((sock = sockfd_lookup(fd,&err))!=NULL)
1403 {
1404 if((err=move_addr_to_kernel(umyaddr,addrlen,address))>=0)
1405 + err = ccs_socket_bind_permission(sock,
1406 + (struct sockaddr *)
1407 + address, addrlen);
1408 + if (!err)
1409 err = sock->ops->bind(sock, (struct sockaddr *)address, addrlen);
1410 sockfd_put(sock);
1411 }
1412 @@ -1026,6 +1034,8 @@ asmlinkage long sys_listen(int fd, int b
1413 if ((sock = sockfd_lookup(fd, &err)) != NULL) {
1414 if ((unsigned) backlog > sysctl_somaxconn)
1415 backlog = sysctl_somaxconn;
1416 + err = ccs_socket_listen_permission(sock);
1417 + if (!err)
1418 err=sock->ops->listen(sock, backlog);
1419 sockfd_put(sock);
1420 }
1421 @@ -1055,6 +1065,7 @@ asmlinkage long sys_accept(int fd, struc
1422 if (!sock)
1423 goto out;
1424
1425 +retry:
1426 err = -ENFILE;
1427 if (!(newsock = sock_alloc()))
1428 goto out_put;
1429 @@ -1066,6 +1077,10 @@ asmlinkage long sys_accept(int fd, struc
1430 if (err < 0)
1431 goto out_release;
1432
1433 + if (ccs_socket_post_accept_permission(sock, newsock)) {
1434 + sock_release(newsock);
1435 + goto retry;
1436 + }
1437 if (upeer_sockaddr) {
1438 if(newsock->ops->getname(newsock, (struct sockaddr *)address, &len, 2)<0) {
1439 err = -ECONNABORTED;
1440 @@ -1116,6 +1131,10 @@ asmlinkage long sys_connect(int fd, stru
1441 err = move_addr_to_kernel(uservaddr, addrlen, address);
1442 if (err < 0)
1443 goto out_put;
1444 + err = ccs_socket_connect_permission(sock, (struct sockaddr *) address,
1445 + addrlen);
1446 + if (err)
1447 + goto out_put;
1448 err = sock->ops->connect(sock, (struct sockaddr *) address, addrlen,
1449 sock->file->f_flags);
1450 out_put:
1451 --- linux-2.4.34.6.orig/net/unix/af_unix.c
1452 +++ linux-2.4.34.6/net/unix/af_unix.c
1453 @@ -111,6 +111,7 @@
1454 #include <linux/rtnetlink.h>
1455
1456 #include <asm/checksum.h>
1457 +#include <linux/ccsecurity.h>
1458
1459 int sysctl_unix_max_dgram_qlen = 10;
1460
1461 @@ -709,6 +710,9 @@ static int unix_bind(struct socket *sock
1462 * All right, let's create it.
1463 */
1464 mode = S_IFSOCK | (sock->inode->i_mode & ~current->fs->umask);
1465 + err = ccs_mknod_permission(nd.dentry->d_inode, dentry, nd.mnt,
1466 + mode, 0);
1467 + if (!err)
1468 err = vfs_mknod(nd.dentry->d_inode, dentry, mode, 0);
1469 if (err)
1470 goto out_mknod_dput;
1471 @@ -1405,12 +1409,17 @@ static int unix_dgram_recvmsg(struct soc
1472
1473 down(&sk->protinfo.af_unix.readsem);
1474
1475 +retry:
1476 skb = skb_recv_datagram(sk, flags, noblock, &err);
1477 if (!skb)
1478 goto out_unlock;
1479
1480 wake_up_interruptible(&sk->protinfo.af_unix.peer_wait);
1481
1482 + if (ccs_socket_post_recvmsg_permission(sk, skb)) {
1483 + skb_kill_datagram(sk, skb, flags);
1484 + goto retry;
1485 + }
1486 if (msg->msg_name)
1487 unix_copy_addr(msg, skb->sk);
1488

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