| 1 |
This is TOMOYO Linux patch for CentOS 6. |
| 2 |
|
| 3 |
Source code for this patch is https://vault.centos.org/centos/6/updates/Source/SPackages/kernel-2.6.32-754.35.1.el6.src.rpm |
| 4 |
--- |
| 5 |
fs/compat.c | 2 +- |
| 6 |
fs/compat_ioctl.c | 3 +++ |
| 7 |
fs/exec.c | 2 +- |
| 8 |
fs/fcntl.c | 4 ++++ |
| 9 |
fs/ioctl.c | 2 ++ |
| 10 |
fs/namei.c | 24 ++++++++++++++++++++++++ |
| 11 |
fs/namespace.c | 8 ++++++++ |
| 12 |
fs/open.c | 20 ++++++++++++++++++++ |
| 13 |
fs/proc/version.c | 7 +++++++ |
| 14 |
fs/stat.c | 2 ++ |
| 15 |
include/linux/init_task.h | 9 +++++++++ |
| 16 |
include/linux/sched.h | 6 ++++++ |
| 17 |
include/linux/security.h | 1 + |
| 18 |
include/net/ip.h | 3 +++ |
| 19 |
kernel/compat.c | 2 ++ |
| 20 |
kernel/fork.c | 5 +++++ |
| 21 |
kernel/kexec.c | 3 +++ |
| 22 |
kernel/module.c | 5 +++++ |
| 23 |
kernel/ptrace.c | 10 ++++++++++ |
| 24 |
kernel/sched.c | 2 ++ |
| 25 |
kernel/signal.c | 10 ++++++++++ |
| 26 |
kernel/sys.c | 10 ++++++++++ |
| 27 |
kernel/sysctl.c | 3 +++ |
| 28 |
kernel/time.c | 4 ++++ |
| 29 |
kernel/time/ntp.c | 6 ++++++ |
| 30 |
net/ipv4/raw.c | 5 +++++ |
| 31 |
net/ipv4/udp.c | 5 +++++ |
| 32 |
net/ipv6/raw.c | 5 +++++ |
| 33 |
net/ipv6/udp.c | 5 +++++ |
| 34 |
net/socket.c | 18 ++++++++++++++++++ |
| 35 |
net/unix/af_unix.c | 7 +++++++ |
| 36 |
security/Kconfig | 2 ++ |
| 37 |
security/Makefile | 3 +++ |
| 38 |
33 files changed, 201 insertions(+), 2 deletions(-) |
| 39 |
|
| 40 |
--- linux-2.6.32-754.35.1.el6.orig/fs/compat.c |
| 41 |
+++ linux-2.6.32-754.35.1.el6/fs/compat.c |
| 42 |
@@ -1524,7 +1524,7 @@ int compat_do_execve(const char * filena |
| 43 |
if (retval < 0) |
| 44 |
goto out; |
| 45 |
|
| 46 |
- retval = search_binary_handler(bprm, regs); |
| 47 |
+ retval = ccs_search_binary_handler(bprm, regs); |
| 48 |
if (retval < 0) |
| 49 |
goto out; |
| 50 |
|
| 51 |
--- linux-2.6.32-754.35.1.el6.orig/fs/compat_ioctl.c |
| 52 |
+++ linux-2.6.32-754.35.1.el6/fs/compat_ioctl.c |
| 53 |
@@ -114,6 +114,7 @@ |
| 54 |
#ifdef CONFIG_SPARC |
| 55 |
#include <asm/fbio.h> |
| 56 |
#endif |
| 57 |
+#include <linux/ccsecurity.h> |
| 58 |
|
| 59 |
static int do_ioctl32_pointer(unsigned int fd, unsigned int cmd, |
| 60 |
unsigned long arg, struct file *f) |
| 61 |
@@ -2766,6 +2767,8 @@ asmlinkage long compat_sys_ioctl(unsigne |
| 62 |
|
| 63 |
/* RED-PEN how should LSM module know it's handling 32bit? */ |
| 64 |
error = security_file_ioctl(filp, cmd, arg); |
| 65 |
+ if (!error) |
| 66 |
+ error = ccs_ioctl_permission(filp, cmd, arg); |
| 67 |
if (error) |
| 68 |
goto out_fput; |
| 69 |
|
| 70 |
--- linux-2.6.32-754.35.1.el6.orig/fs/exec.c |
| 71 |
+++ linux-2.6.32-754.35.1.el6/fs/exec.c |
| 72 |
@@ -1511,7 +1511,7 @@ int do_execve(const char * filename, |
| 73 |
goto out; |
| 74 |
|
| 75 |
current->flags &= ~PF_KTHREAD; |
| 76 |
- retval = search_binary_handler(bprm,regs); |
| 77 |
+ retval = ccs_search_binary_handler(bprm, regs); |
| 78 |
if (retval < 0) |
| 79 |
goto out; |
| 80 |
|
| 81 |
--- linux-2.6.32-754.35.1.el6.orig/fs/fcntl.c |
| 82 |
+++ linux-2.6.32-754.35.1.el6/fs/fcntl.c |
| 83 |
@@ -431,6 +431,8 @@ SYSCALL_DEFINE3(fcntl, unsigned int, fd, |
| 84 |
goto out; |
| 85 |
|
| 86 |
err = security_file_fcntl(filp, cmd, arg); |
| 87 |
+ if (!err) |
| 88 |
+ err = ccs_fcntl_permission(filp, cmd, arg); |
| 89 |
if (err) { |
| 90 |
fput(filp); |
| 91 |
return err; |
| 92 |
@@ -456,6 +458,8 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, f |
| 93 |
goto out; |
| 94 |
|
| 95 |
err = security_file_fcntl(filp, cmd, arg); |
| 96 |
+ if (!err) |
| 97 |
+ err = ccs_fcntl_permission(filp, cmd, arg); |
| 98 |
if (err) { |
| 99 |
fput(filp); |
| 100 |
return err; |
| 101 |
--- linux-2.6.32-754.35.1.el6.orig/fs/ioctl.c |
| 102 |
+++ linux-2.6.32-754.35.1.el6/fs/ioctl.c |
| 103 |
@@ -639,6 +639,8 @@ SYSCALL_DEFINE3(ioctl, unsigned int, fd, |
| 104 |
goto out; |
| 105 |
|
| 106 |
error = security_file_ioctl(filp, cmd, arg); |
| 107 |
+ if (!error) |
| 108 |
+ error = ccs_ioctl_permission(filp, cmd, arg); |
| 109 |
if (error) |
| 110 |
goto out_fput; |
| 111 |
|
| 112 |
--- linux-2.6.32-754.35.1.el6.orig/fs/namei.c |
| 113 |
+++ linux-2.6.32-754.35.1.el6/fs/namei.c |
| 114 |
@@ -2070,6 +2070,11 @@ int may_open(struct path *path, int acc_ |
| 115 |
if (flag & O_NOATIME && !is_owner_or_cap(inode)) |
| 116 |
return -EPERM; |
| 117 |
|
| 118 |
+ /* includes O_APPEND and O_TRUNC checks */ |
| 119 |
+ error = ccs_open_permission(dentry, path->mnt, flag); |
| 120 |
+ if (error) |
| 121 |
+ return error; |
| 122 |
+ |
| 123 |
/* |
| 124 |
* Ensure there are no outstanding leases on the file. |
| 125 |
*/ |
| 126 |
@@ -2113,6 +2118,9 @@ static int __open_namei_create(struct na |
| 127 |
if (!IS_POSIXACL(dir->d_inode)) |
| 128 |
mode &= ~current_umask(); |
| 129 |
error = security_path_mknod(&nd->path, path->dentry, mode, 0); |
| 130 |
+ if (!error) |
| 131 |
+ error = ccs_mknod_permission(path->dentry, nd->path.mnt, mode, |
| 132 |
+ 0); |
| 133 |
if (error) |
| 134 |
goto out_unlock; |
| 135 |
error = vfs_create(dir->d_inode, path->dentry, mode, nd); |
| 136 |
@@ -2615,6 +2623,8 @@ retry: |
| 137 |
if (error) |
| 138 |
goto out_dput; |
| 139 |
error = security_path_mknod(&nd.path, dentry, mode, dev); |
| 140 |
+ if (!error) |
| 141 |
+ error = ccs_mknod_permission(dentry, nd.path.mnt, mode, dev); |
| 142 |
if (error) |
| 143 |
goto out_dput; |
| 144 |
switch (mode & S_IFMT) { |
| 145 |
@@ -2699,6 +2709,8 @@ retry: |
| 146 |
if (!IS_POSIXACL(nd.path.dentry->d_inode)) |
| 147 |
mode &= ~current_umask(); |
| 148 |
error = security_path_mkdir(&nd.path, dentry, mode); |
| 149 |
+ if (!error) |
| 150 |
+ error = ccs_mkdir_permission(dentry, nd.path.mnt, mode); |
| 151 |
if (error) |
| 152 |
goto out_dput; |
| 153 |
error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode); |
| 154 |
@@ -2817,6 +2829,8 @@ retry: |
| 155 |
if (IS_ERR(dentry)) |
| 156 |
goto exit2; |
| 157 |
error = security_path_rmdir(&nd.path, dentry); |
| 158 |
+ if (!error) |
| 159 |
+ error = ccs_rmdir_permission(dentry, nd.path.mnt); |
| 160 |
if (error) |
| 161 |
goto exit3; |
| 162 |
error = vfs_rmdir(nd.path.dentry->d_inode, dentry); |
| 163 |
@@ -2910,6 +2924,8 @@ retry: |
| 164 |
if (inode) |
| 165 |
atomic_inc(&inode->i_count); |
| 166 |
error = security_path_unlink(&nd.path, dentry); |
| 167 |
+ if (!error) |
| 168 |
+ error = ccs_unlink_permission(dentry, nd.path.mnt); |
| 169 |
if (error) |
| 170 |
goto exit2; |
| 171 |
error = vfs_unlink(nd.path.dentry->d_inode, dentry); |
| 172 |
@@ -3006,6 +3022,8 @@ retry: |
| 173 |
goto out_dput; |
| 174 |
} |
| 175 |
error = security_path_symlink(&nd.path, dentry, from->name); |
| 176 |
+ if (!error) |
| 177 |
+ error = ccs_symlink_permission(dentry, nd.path.mnt, from->name); |
| 178 |
if (error) |
| 179 |
goto out_dput; |
| 180 |
error = vfs_symlink(nd.path.dentry->d_inode, dentry, from->name); |
| 181 |
@@ -3121,6 +3139,9 @@ retry: |
| 182 |
if (IS_ERR(new_dentry)) |
| 183 |
goto out_unlock; |
| 184 |
error = security_path_link(old_path.dentry, &nd.path, new_dentry); |
| 185 |
+ if (!error) |
| 186 |
+ error = ccs_link_permission(old_path.dentry, new_dentry, |
| 187 |
+ nd.path.mnt); |
| 188 |
if (error) |
| 189 |
goto out_dput; |
| 190 |
error = vfs_link(old_path.dentry, nd.path.dentry->d_inode, new_dentry); |
| 191 |
@@ -3373,6 +3394,9 @@ retry: |
| 192 |
|
| 193 |
error = security_path_rename(&oldnd.path, old_dentry, |
| 194 |
&newnd.path, new_dentry); |
| 195 |
+ if (!error) |
| 196 |
+ error = ccs_rename_permission(old_dentry, new_dentry, |
| 197 |
+ newnd.path.mnt); |
| 198 |
if (error) |
| 199 |
goto exit5; |
| 200 |
error = vfs_rename(old_dir->d_inode, old_dentry, |
| 201 |
--- linux-2.6.32-754.35.1.el6.orig/fs/namespace.c |
| 202 |
+++ linux-2.6.32-754.35.1.el6/fs/namespace.c |
| 203 |
@@ -1097,6 +1097,8 @@ static int do_umount(struct vfsmount *mn |
| 204 |
LIST_HEAD(umount_list); |
| 205 |
|
| 206 |
retval = security_sb_umount(mnt, flags); |
| 207 |
+ if (!retval) |
| 208 |
+ retval = ccs_umount_permission(mnt, flags); |
| 209 |
if (retval) |
| 210 |
return retval; |
| 211 |
|
| 212 |
@@ -2085,6 +2087,7 @@ int copy_mount_string(const void __user |
| 213 |
long do_mount(char *dev_name, const char *dir_name, char *type_page, |
| 214 |
unsigned long flags, void *data_page) |
| 215 |
{ |
| 216 |
+ const unsigned long original_flags = flags; |
| 217 |
struct path path; |
| 218 |
int retval = 0; |
| 219 |
int mnt_flags = 0; |
| 220 |
@@ -2132,6 +2135,9 @@ long do_mount(char *dev_name, const char |
| 221 |
|
| 222 |
retval = security_sb_mount(dev_name, &path, |
| 223 |
type_page, flags, data_page); |
| 224 |
+ if (!retval) |
| 225 |
+ retval = ccs_mount_permission(dev_name, &path, type_page, |
| 226 |
+ original_flags, data_page); |
| 227 |
if (retval) |
| 228 |
goto dput_out; |
| 229 |
|
| 230 |
@@ -2372,6 +2378,8 @@ SYSCALL_DEFINE2(pivot_root, const char _ |
| 231 |
goto out1; |
| 232 |
|
| 233 |
error = security_sb_pivotroot(&old, &new); |
| 234 |
+ if (!error) |
| 235 |
+ error = ccs_pivot_root_permission(&old, &new); |
| 236 |
if (error) { |
| 237 |
path_put(&old); |
| 238 |
goto out1; |
| 239 |
--- linux-2.6.32-754.35.1.el6.orig/fs/open.c |
| 240 |
+++ linux-2.6.32-754.35.1.el6/fs/open.c |
| 241 |
@@ -103,6 +103,8 @@ long vfs_truncate(struct path *path, lof |
| 242 |
error = locks_verify_truncate(inode, NULL, length); |
| 243 |
if (!error) |
| 244 |
error = security_path_truncate(path, length, 0); |
| 245 |
+ if (!error) |
| 246 |
+ error = ccs_truncate_permission(path->dentry, path->mnt); |
| 247 |
if (!error) { |
| 248 |
vfs_dq_init(inode); |
| 249 |
error = do_truncate(path->dentry, length, 0, NULL); |
| 250 |
@@ -184,6 +186,8 @@ static long do_sys_ftruncate(unsigned in |
| 251 |
error = security_path_truncate(&file->f_path, length, |
| 252 |
ATTR_MTIME|ATTR_CTIME); |
| 253 |
if (!error) |
| 254 |
+ error = ccs_truncate_permission(dentry, file->f_vfsmnt); |
| 255 |
+ if (!error) |
| 256 |
error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file); |
| 257 |
sb_end_write(inode->i_sb); |
| 258 |
out_putf: |
| 259 |
@@ -465,6 +469,8 @@ retry: |
| 260 |
error = -EPERM; |
| 261 |
if (!capable(CAP_SYS_CHROOT)) |
| 262 |
goto dput_and_out; |
| 263 |
+ if (ccs_chroot_permission(&path)) |
| 264 |
+ goto dput_and_out; |
| 265 |
|
| 266 |
set_fs_root(current->fs, &path); |
| 267 |
error = 0; |
| 268 |
@@ -498,6 +504,9 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd |
| 269 |
err = mnt_want_write_file(file); |
| 270 |
if (err) |
| 271 |
goto out_putf; |
| 272 |
+ err = ccs_chmod_permission(dentry, file->f_vfsmnt, mode); |
| 273 |
+ if (err) |
| 274 |
+ goto out_drop_write; |
| 275 |
mutex_lock(&inode->i_mutex); |
| 276 |
if (mode == (mode_t) -1) |
| 277 |
mode = inode->i_mode; |
| 278 |
@@ -505,6 +514,7 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd |
| 279 |
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; |
| 280 |
err = notify_change(dentry, &newattrs); |
| 281 |
mutex_unlock(&inode->i_mutex); |
| 282 |
+out_drop_write: |
| 283 |
mnt_drop_write(file->f_path.mnt); |
| 284 |
out_putf: |
| 285 |
fput(file); |
| 286 |
@@ -528,6 +538,9 @@ retry: |
| 287 |
error = mnt_want_write(path.mnt); |
| 288 |
if (error) |
| 289 |
goto dput_and_out; |
| 290 |
+ error = ccs_chmod_permission(path.dentry, path.mnt, mode); |
| 291 |
+ if (error) |
| 292 |
+ goto out_drop_write; |
| 293 |
mutex_lock(&inode->i_mutex); |
| 294 |
if (mode == (mode_t) -1) |
| 295 |
mode = inode->i_mode; |
| 296 |
@@ -535,6 +548,7 @@ retry: |
| 297 |
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; |
| 298 |
error = notify_change(path.dentry, &newattrs); |
| 299 |
mutex_unlock(&inode->i_mutex); |
| 300 |
+out_drop_write: |
| 301 |
mnt_drop_write(path.mnt); |
| 302 |
dput_and_out: |
| 303 |
path_put(&path); |
| 304 |
@@ -594,6 +608,8 @@ retry: |
| 305 |
error = mnt_want_write(path.mnt); |
| 306 |
if (error) |
| 307 |
goto out_release; |
| 308 |
+ error = ccs_chown_permission(path.dentry, path.mnt, user, group); |
| 309 |
+ if (!error) |
| 310 |
error = chown_common(path.dentry, user, group); |
| 311 |
mnt_drop_write(path.mnt); |
| 312 |
out_release: |
| 313 |
@@ -632,6 +648,8 @@ SYSCALL_DEFINE3(fchown, unsigned int, fd |
| 314 |
goto out_fput; |
| 315 |
dentry = file->f_path.dentry; |
| 316 |
audit_inode(NULL, dentry, 0); |
| 317 |
+ error = ccs_chown_permission(dentry, file->f_path.mnt, user, group); |
| 318 |
+ if (!error) |
| 319 |
error = chown_common(dentry, user, group); |
| 320 |
mnt_drop_write(file->f_path.mnt); |
| 321 |
out_fput: |
| 322 |
@@ -1032,6 +1050,8 @@ EXPORT_SYMBOL(sys_close); |
| 323 |
*/ |
| 324 |
SYSCALL_DEFINE0(vhangup) |
| 325 |
{ |
| 326 |
+ if (!ccs_capable(CCS_SYS_VHANGUP)) |
| 327 |
+ return -EPERM; |
| 328 |
if (capable(CAP_SYS_TTY_CONFIG)) { |
| 329 |
tty_vhangup_self(); |
| 330 |
return 0; |
| 331 |
--- linux-2.6.32-754.35.1.el6.orig/fs/proc/version.c |
| 332 |
+++ linux-2.6.32-754.35.1.el6/fs/proc/version.c |
| 333 |
@@ -32,3 +32,10 @@ static int __init proc_version_init(void |
| 334 |
return 0; |
| 335 |
} |
| 336 |
module_init(proc_version_init); |
| 337 |
+ |
| 338 |
+static int __init ccs_show_version(void) |
| 339 |
+{ |
| 340 |
+ printk(KERN_INFO "Hook version: 2.6.32-754.35.1.el6 2020/11/10\n"); |
| 341 |
+ return 0; |
| 342 |
+} |
| 343 |
+module_init(ccs_show_version); |
| 344 |
--- linux-2.6.32-754.35.1.el6.orig/fs/stat.c |
| 345 |
+++ linux-2.6.32-754.35.1.el6/fs/stat.c |
| 346 |
@@ -43,6 +43,8 @@ int vfs_getattr(struct vfsmount *mnt, st |
| 347 |
int retval; |
| 348 |
|
| 349 |
retval = security_inode_getattr(mnt, dentry); |
| 350 |
+ if (!retval) |
| 351 |
+ retval = ccs_getattr_permission(mnt, dentry); |
| 352 |
if (retval) |
| 353 |
return retval; |
| 354 |
|
| 355 |
--- linux-2.6.32-754.35.1.el6.orig/include/linux/init_task.h |
| 356 |
+++ linux-2.6.32-754.35.1.el6/include/linux/init_task.h |
| 357 |
@@ -123,6 +123,14 @@ extern struct cred init_cred; |
| 358 |
# define INIT_PERF_EVENTS(tsk) |
| 359 |
#endif |
| 360 |
|
| 361 |
+#if defined(CONFIG_CCSECURITY) && !defined(CONFIG_CCSECURITY_USE_EXTERNAL_TASK_SECURITY) |
| 362 |
+#define INIT_CCSECURITY \ |
| 363 |
+ .ccs_domain_info = NULL, \ |
| 364 |
+ .ccs_flags = 0, |
| 365 |
+#else |
| 366 |
+#define INIT_CCSECURITY |
| 367 |
+#endif |
| 368 |
+ |
| 369 |
/* |
| 370 |
* INIT_TASK is used to set up the first task table, touch at |
| 371 |
* your own risk!. Base=0, limit=0x1fffff (=2MB) |
| 372 |
@@ -192,6 +200,7 @@ extern struct cred init_cred; |
| 373 |
INIT_FTRACE_GRAPH \ |
| 374 |
INIT_TRACE_RECURSION \ |
| 375 |
INIT_TASK_RCU_PREEMPT(tsk) \ |
| 376 |
+ INIT_CCSECURITY \ |
| 377 |
} |
| 378 |
|
| 379 |
|
| 380 |
--- linux-2.6.32-754.35.1.el6.orig/include/linux/sched.h |
| 381 |
+++ linux-2.6.32-754.35.1.el6/include/linux/sched.h |
| 382 |
@@ -43,6 +43,8 @@ |
| 383 |
|
| 384 |
#ifdef __KERNEL__ |
| 385 |
|
| 386 |
+struct ccs_domain_info; |
| 387 |
+ |
| 388 |
struct sched_param { |
| 389 |
int sched_priority; |
| 390 |
}; |
| 391 |
@@ -1722,6 +1724,10 @@ struct task_struct { |
| 392 |
} memcg_oom; |
| 393 |
#endif |
| 394 |
#endif /* __GENKYSMS__ */ |
| 395 |
+#if defined(CONFIG_CCSECURITY) && !defined(CONFIG_CCSECURITY_USE_EXTERNAL_TASK_SECURITY) |
| 396 |
+ struct ccs_domain_info *ccs_domain_info; |
| 397 |
+ u32 ccs_flags; |
| 398 |
+#endif |
| 399 |
}; |
| 400 |
|
| 401 |
/* Future-safe accessor for struct task_struct's cpus_allowed. */ |
| 402 |
--- linux-2.6.32-754.35.1.el6.orig/include/linux/security.h |
| 403 |
+++ linux-2.6.32-754.35.1.el6/include/linux/security.h |
| 404 |
@@ -35,6 +35,7 @@ |
| 405 |
#include <linux/xfrm.h> |
| 406 |
#include <linux/gfp.h> |
| 407 |
#include <net/flow.h> |
| 408 |
+#include <linux/ccsecurity.h> |
| 409 |
|
| 410 |
/* Maximum number of letters for an LSM name string */ |
| 411 |
#define SECURITY_NAME_MAX 10 |
| 412 |
--- linux-2.6.32-754.35.1.el6.orig/include/net/ip.h |
| 413 |
+++ linux-2.6.32-754.35.1.el6/include/net/ip.h |
| 414 |
@@ -33,6 +33,7 @@ |
| 415 |
#endif |
| 416 |
#include <net/snmp.h> |
| 417 |
#include <net/flow.h> |
| 418 |
+#include <linux/ccsecurity.h> |
| 419 |
|
| 420 |
struct sock; |
| 421 |
|
| 422 |
@@ -223,6 +224,8 @@ extern void inet_get_local_port_range(in |
| 423 |
extern unsigned long *sysctl_local_reserved_ports; |
| 424 |
static inline int inet_is_reserved_local_port(int port) |
| 425 |
{ |
| 426 |
+ if (ccs_lport_reserved(port)) |
| 427 |
+ return 1; |
| 428 |
return test_bit(port, sysctl_local_reserved_ports); |
| 429 |
} |
| 430 |
|
| 431 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/compat.c |
| 432 |
+++ linux-2.6.32-754.35.1.el6/kernel/compat.c |
| 433 |
@@ -1005,6 +1005,8 @@ asmlinkage long compat_sys_stime(compat_ |
| 434 |
err = security_settime(&tv, NULL); |
| 435 |
if (err) |
| 436 |
return err; |
| 437 |
+ if (!ccs_capable(CCS_SYS_SETTIME)) |
| 438 |
+ return -EPERM; |
| 439 |
|
| 440 |
do_settimeofday(&tv); |
| 441 |
return 0; |
| 442 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/fork.c |
| 443 |
+++ linux-2.6.32-754.35.1.el6/kernel/fork.c |
| 444 |
@@ -206,6 +206,7 @@ void __put_task_struct(struct task_struc |
| 445 |
exit_creds(tsk); |
| 446 |
delayacct_tsk_free(tsk); |
| 447 |
|
| 448 |
+ ccs_free_task_security(tsk); |
| 449 |
if (!profile_handoff_task(tsk)) |
| 450 |
free_task(tsk); |
| 451 |
} |
| 452 |
@@ -1270,6 +1271,9 @@ static struct task_struct *copy_process( |
| 453 |
|
| 454 |
if ((retval = audit_alloc(p))) |
| 455 |
goto bad_fork_cleanup_perf; |
| 456 |
+ retval = ccs_alloc_task_security(p); |
| 457 |
+ if (retval) |
| 458 |
+ goto bad_fork_cleanup_audit; |
| 459 |
/* copy all the process information */ |
| 460 |
if ((retval = copy_semundo(clone_flags, p))) |
| 461 |
goto bad_fork_cleanup_audit; |
| 462 |
@@ -1455,6 +1459,7 @@ bad_fork_cleanup_semundo: |
| 463 |
exit_sem(p); |
| 464 |
bad_fork_cleanup_audit: |
| 465 |
audit_free(p); |
| 466 |
+ ccs_free_task_security(p); |
| 467 |
bad_fork_cleanup_perf: |
| 468 |
perf_event_free_task(p); |
| 469 |
bad_fork_cleanup_policy: |
| 470 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/kexec.c |
| 471 |
+++ linux-2.6.32-754.35.1.el6/kernel/kexec.c |
| 472 |
@@ -41,6 +41,7 @@ |
| 473 |
#include <asm/system.h> |
| 474 |
#include <asm/sections.h> |
| 475 |
#include <asm/setup.h> |
| 476 |
+#include <linux/ccsecurity.h> |
| 477 |
|
| 478 |
/* Per cpu memory for storing cpu states in case of system crash. */ |
| 479 |
note_buf_t __percpu *crash_notes; |
| 480 |
@@ -951,6 +952,8 @@ SYSCALL_DEFINE4(kexec_load, unsigned lon |
| 481 |
/* We only trust the superuser with rebooting the system. */ |
| 482 |
if (!capable(CAP_SYS_BOOT)) |
| 483 |
return -EPERM; |
| 484 |
+ if (!ccs_capable(CCS_SYS_KEXEC_LOAD)) |
| 485 |
+ return -EPERM; |
| 486 |
|
| 487 |
if (kexec_load_disabled) |
| 488 |
return -EPERM; |
| 489 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/module.c |
| 490 |
+++ linux-2.6.32-754.35.1.el6/kernel/module.c |
| 491 |
@@ -57,6 +57,7 @@ |
| 492 |
#include <linux/percpu.h> |
| 493 |
#include <linux/kmemleak.h> |
| 494 |
#include "module-verify.h" |
| 495 |
+#include <linux/ccsecurity.h> |
| 496 |
|
| 497 |
#define CREATE_TRACE_POINTS |
| 498 |
#include <trace/events/module.h> |
| 499 |
@@ -806,6 +807,8 @@ SYSCALL_DEFINE2(delete_module, const cha |
| 500 |
|
| 501 |
if (!capable(CAP_SYS_MODULE) || modules_disabled) |
| 502 |
return -EPERM; |
| 503 |
+ if (!ccs_capable(CCS_USE_KERNEL_MODULE)) |
| 504 |
+ return -EPERM; |
| 505 |
|
| 506 |
if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0) |
| 507 |
return -EFAULT; |
| 508 |
@@ -2626,6 +2629,8 @@ SYSCALL_DEFINE3(init_module, void __user |
| 509 |
/* Must have permission */ |
| 510 |
if (!capable(CAP_SYS_MODULE) || modules_disabled) |
| 511 |
return -EPERM; |
| 512 |
+ if (!ccs_capable(CCS_USE_KERNEL_MODULE)) |
| 513 |
+ return -EPERM; |
| 514 |
|
| 515 |
/* |
| 516 |
* Make sure we don't speculate past the CAP_SYS_MODULE check. The |
| 517 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/ptrace.c |
| 518 |
+++ linux-2.6.32-754.35.1.el6/kernel/ptrace.c |
| 519 |
@@ -199,6 +199,11 @@ SYSCALL_DEFINE4(ptrace, long, request, l |
| 520 |
{ |
| 521 |
struct task_struct *child; |
| 522 |
long ret; |
| 523 |
+ { |
| 524 |
+ const int rc = ccs_ptrace_permission(request, pid); |
| 525 |
+ if (rc) |
| 526 |
+ return rc; |
| 527 |
+ } |
| 528 |
|
| 529 |
if (request == PTRACE_TRACEME) { |
| 530 |
ret = ptrace_traceme(); |
| 531 |
@@ -265,6 +270,11 @@ asmlinkage long compat_sys_ptrace(compat |
| 532 |
{ |
| 533 |
struct task_struct *child; |
| 534 |
long ret; |
| 535 |
+ { |
| 536 |
+ const int rc = ccs_ptrace_permission(request, pid); |
| 537 |
+ if (rc) |
| 538 |
+ return rc; |
| 539 |
+ } |
| 540 |
|
| 541 |
if (request == PTRACE_TRACEME) { |
| 542 |
ret = ptrace_traceme(); |
| 543 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/sched.c |
| 544 |
+++ linux-2.6.32-754.35.1.el6/kernel/sched.c |
| 545 |
@@ -6869,6 +6869,8 @@ int can_nice(const struct task_struct *p |
| 546 |
SYSCALL_DEFINE1(nice, int, increment) |
| 547 |
{ |
| 548 |
long nice, retval; |
| 549 |
+ if (!ccs_capable(CCS_SYS_NICE)) |
| 550 |
+ return -EPERM; |
| 551 |
|
| 552 |
/* |
| 553 |
* Setpriority might change our priority at the same moment. |
| 554 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/signal.c |
| 555 |
+++ linux-2.6.32-754.35.1.el6/kernel/signal.c |
| 556 |
@@ -2316,6 +2316,8 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const s |
| 557 |
SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) |
| 558 |
{ |
| 559 |
struct siginfo info; |
| 560 |
+ if (ccs_kill_permission(pid, sig)) |
| 561 |
+ return -EPERM; |
| 562 |
|
| 563 |
info.si_signo = sig; |
| 564 |
info.si_errno = 0; |
| 565 |
@@ -2384,6 +2386,8 @@ SYSCALL_DEFINE3(tgkill, pid_t, tgid, pid |
| 566 |
/* This is only valid for single tasks */ |
| 567 |
if (pid <= 0 || tgid <= 0) |
| 568 |
return -EINVAL; |
| 569 |
+ if (ccs_tgkill_permission(tgid, pid, sig)) |
| 570 |
+ return -EPERM; |
| 571 |
|
| 572 |
return do_tkill(tgid, pid, sig); |
| 573 |
} |
| 574 |
@@ -2396,6 +2400,8 @@ SYSCALL_DEFINE2(tkill, pid_t, pid, int, |
| 575 |
/* This is only valid for single tasks */ |
| 576 |
if (pid <= 0) |
| 577 |
return -EINVAL; |
| 578 |
+ if (ccs_tkill_permission(pid, sig)) |
| 579 |
+ return -EPERM; |
| 580 |
|
| 581 |
return do_tkill(0, pid, sig); |
| 582 |
} |
| 583 |
@@ -2415,6 +2421,8 @@ SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, |
| 584 |
return -EPERM; |
| 585 |
|
| 586 |
info.si_signo = sig; |
| 587 |
+ if (ccs_sigqueue_permission(pid, sig)) |
| 588 |
+ return -EPERM; |
| 589 |
|
| 590 |
/* POSIX.1b doesn't mention process groups. */ |
| 591 |
return kill_proc_info(sig, &info, pid); |
| 592 |
@@ -2433,6 +2441,8 @@ long do_rt_tgsigqueueinfo(pid_t tgid, pi |
| 593 |
return -EPERM; |
| 594 |
|
| 595 |
info->si_signo = sig; |
| 596 |
+ if (ccs_tgsigqueue_permission(tgid, pid, sig)) |
| 597 |
+ return -EPERM; |
| 598 |
|
| 599 |
return do_send_specific(tgid, pid, sig, info); |
| 600 |
} |
| 601 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/sys.c |
| 602 |
+++ linux-2.6.32-754.35.1.el6/kernel/sys.c |
| 603 |
@@ -163,6 +163,10 @@ SYSCALL_DEFINE3(setpriority, int, which, |
| 604 |
|
| 605 |
if (which > PRIO_USER || which < PRIO_PROCESS) |
| 606 |
goto out; |
| 607 |
+ if (!ccs_capable(CCS_SYS_NICE)) { |
| 608 |
+ error = -EPERM; |
| 609 |
+ goto out; |
| 610 |
+ } |
| 611 |
|
| 612 |
/* normalize: avoid signed division (rounding problems) */ |
| 613 |
error = -ESRCH; |
| 614 |
@@ -386,6 +390,8 @@ SYSCALL_DEFINE4(reboot, int, magic1, int |
| 615 |
magic2 != LINUX_REBOOT_MAGIC2B && |
| 616 |
magic2 != LINUX_REBOOT_MAGIC2C)) |
| 617 |
return -EINVAL; |
| 618 |
+ if (!ccs_capable(CCS_SYS_REBOOT)) |
| 619 |
+ return -EPERM; |
| 620 |
|
| 621 |
/* |
| 622 |
* If pid namespaces are enabled and the current task is in a child |
| 623 |
@@ -1159,6 +1165,8 @@ SYSCALL_DEFINE2(sethostname, char __user |
| 624 |
return -EPERM; |
| 625 |
if (len < 0 || len > __NEW_UTS_LEN) |
| 626 |
return -EINVAL; |
| 627 |
+ if (!ccs_capable(CCS_SYS_SETHOSTNAME)) |
| 628 |
+ return -EPERM; |
| 629 |
down_write(&uts_sem); |
| 630 |
errno = -EFAULT; |
| 631 |
if (!copy_from_user(tmp, name, len)) { |
| 632 |
@@ -1208,6 +1216,8 @@ SYSCALL_DEFINE2(setdomainname, char __us |
| 633 |
return -EPERM; |
| 634 |
if (len < 0 || len > __NEW_UTS_LEN) |
| 635 |
return -EINVAL; |
| 636 |
+ if (!ccs_capable(CCS_SYS_SETHOSTNAME)) |
| 637 |
+ return -EPERM; |
| 638 |
|
| 639 |
down_write(&uts_sem); |
| 640 |
errno = -EFAULT; |
| 641 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/sysctl.c |
| 642 |
+++ linux-2.6.32-754.35.1.el6/kernel/sysctl.c |
| 643 |
@@ -2154,6 +2154,9 @@ int do_sysctl(int __user *name, int nlen |
| 644 |
|
| 645 |
for (head = sysctl_head_next(NULL); head; |
| 646 |
head = sysctl_head_next(head)) { |
| 647 |
+ error = ccs_parse_table(name, nlen, oldval, newval, |
| 648 |
+ head->ctl_table); |
| 649 |
+ if (!error) |
| 650 |
error = parse_table(name, nlen, oldval, oldlenp, |
| 651 |
newval, newlen, |
| 652 |
head->root, head->ctl_table); |
| 653 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/time.c |
| 654 |
+++ linux-2.6.32-754.35.1.el6/kernel/time.c |
| 655 |
@@ -92,6 +92,8 @@ SYSCALL_DEFINE1(stime, time_t __user *, |
| 656 |
err = security_settime(&tv, NULL); |
| 657 |
if (err) |
| 658 |
return err; |
| 659 |
+ if (!ccs_capable(CCS_SYS_SETTIME)) |
| 660 |
+ return -EPERM; |
| 661 |
|
| 662 |
do_settimeofday(&tv); |
| 663 |
return 0; |
| 664 |
@@ -170,6 +172,8 @@ int do_sys_settimeofday(const struct tim |
| 665 |
error = security_settime(tv, tz); |
| 666 |
if (error) |
| 667 |
return error; |
| 668 |
+ if (!ccs_capable(CCS_SYS_SETTIME)) |
| 669 |
+ return -EPERM; |
| 670 |
|
| 671 |
if (tz) { |
| 672 |
/* SMP safe, global irq locking makes it work. */ |
| 673 |
--- linux-2.6.32-754.35.1.el6.orig/kernel/time/ntp.c |
| 674 |
+++ linux-2.6.32-754.35.1.el6/kernel/time/ntp.c |
| 675 |
@@ -14,6 +14,7 @@ |
| 676 |
#include <linux/timex.h> |
| 677 |
#include <linux/time.h> |
| 678 |
#include <linux/mm.h> |
| 679 |
+#include <linux/ccsecurity.h> |
| 680 |
|
| 681 |
#include "timekeeping_internal.h" |
| 682 |
|
| 683 |
@@ -489,10 +490,15 @@ int do_adjtimex(struct timex *txc) |
| 684 |
if (!(txc->modes & ADJ_OFFSET_READONLY) && |
| 685 |
!capable(CAP_SYS_TIME)) |
| 686 |
return -EPERM; |
| 687 |
+ if (!(txc->modes & ADJ_OFFSET_READONLY) && |
| 688 |
+ !ccs_capable(CCS_SYS_SETTIME)) |
| 689 |
+ return -EPERM; |
| 690 |
} else { |
| 691 |
/* In order to modify anything, you gotta be super-user! */ |
| 692 |
if (txc->modes && !capable(CAP_SYS_TIME)) |
| 693 |
return -EPERM; |
| 694 |
+ if (txc->modes && !ccs_capable(CCS_SYS_SETTIME)) |
| 695 |
+ return -EPERM; |
| 696 |
|
| 697 |
/* |
| 698 |
* if the quartz is off by more than 10% then |
| 699 |
--- linux-2.6.32-754.35.1.el6.orig/net/ipv4/raw.c |
| 700 |
+++ linux-2.6.32-754.35.1.el6/net/ipv4/raw.c |
| 701 |
@@ -77,6 +77,7 @@ |
| 702 |
#include <linux/seq_file.h> |
| 703 |
#include <linux/netfilter.h> |
| 704 |
#include <linux/netfilter_ipv4.h> |
| 705 |
+#include <linux/ccsecurity.h> |
| 706 |
|
| 707 |
static struct raw_hashinfo raw_v4_hashinfo = { |
| 708 |
.lock = __RW_LOCK_UNLOCKED(raw_v4_hashinfo.lock), |
| 709 |
@@ -691,6 +692,10 @@ static int raw_recvmsg(struct kiocb *ioc |
| 710 |
skb = skb_recv_datagram(sk, flags, noblock, &err); |
| 711 |
if (!skb) |
| 712 |
goto out; |
| 713 |
+ if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) { |
| 714 |
+ err = -EAGAIN; /* Hope less harmful than -EPERM. */ |
| 715 |
+ goto out; |
| 716 |
+ } |
| 717 |
|
| 718 |
copied = skb->len; |
| 719 |
if (len < copied) { |
| 720 |
--- linux-2.6.32-754.35.1.el6.orig/net/ipv4/udp.c |
| 721 |
+++ linux-2.6.32-754.35.1.el6/net/ipv4/udp.c |
| 722 |
@@ -108,6 +108,7 @@ |
| 723 |
#include <trace/events/udp.h> |
| 724 |
#include <net/busy_poll.h> |
| 725 |
#include "udp_impl.h" |
| 726 |
+#include <linux/ccsecurity.h> |
| 727 |
|
| 728 |
struct udp_table udp_table; |
| 729 |
EXPORT_SYMBOL(udp_table); |
| 730 |
@@ -1002,6 +1003,10 @@ try_again: |
| 731 |
&peeked, &err); |
| 732 |
if (!skb) |
| 733 |
goto out; |
| 734 |
+ if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) { |
| 735 |
+ err = -EAGAIN; /* Hope less harmful than -EPERM. */ |
| 736 |
+ goto out; |
| 737 |
+ } |
| 738 |
|
| 739 |
ulen = skb->len - sizeof(struct udphdr); |
| 740 |
copied = len; |
| 741 |
--- linux-2.6.32-754.35.1.el6.orig/net/ipv6/raw.c |
| 742 |
+++ linux-2.6.32-754.35.1.el6/net/ipv6/raw.c |
| 743 |
@@ -59,6 +59,7 @@ |
| 744 |
|
| 745 |
#include <linux/proc_fs.h> |
| 746 |
#include <linux/seq_file.h> |
| 747 |
+#include <linux/ccsecurity.h> |
| 748 |
|
| 749 |
static struct raw_hashinfo raw_v6_hashinfo = { |
| 750 |
.lock = __RW_LOCK_UNLOCKED(raw_v6_hashinfo.lock), |
| 751 |
@@ -462,6 +463,10 @@ static int rawv6_recvmsg(struct kiocb *i |
| 752 |
skb = skb_recv_datagram(sk, flags, noblock, &err); |
| 753 |
if (!skb) |
| 754 |
goto out; |
| 755 |
+ if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) { |
| 756 |
+ err = -EAGAIN; /* Hope less harmful than -EPERM. */ |
| 757 |
+ goto out; |
| 758 |
+ } |
| 759 |
|
| 760 |
copied = skb->len; |
| 761 |
if (copied > len) { |
| 762 |
--- linux-2.6.32-754.35.1.el6.orig/net/ipv6/udp.c |
| 763 |
+++ linux-2.6.32-754.35.1.el6/net/ipv6/udp.c |
| 764 |
@@ -50,6 +50,7 @@ |
| 765 |
#include <linux/proc_fs.h> |
| 766 |
#include <linux/seq_file.h> |
| 767 |
#include "udp_impl.h" |
| 768 |
+#include <linux/ccsecurity.h> |
| 769 |
|
| 770 |
int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) |
| 771 |
{ |
| 772 |
@@ -230,6 +231,10 @@ try_again: |
| 773 |
&peeked, &err); |
| 774 |
if (!skb) |
| 775 |
goto out; |
| 776 |
+ if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) { |
| 777 |
+ err = -EAGAIN; /* Hope less harmful than -EPERM. */ |
| 778 |
+ goto out; |
| 779 |
+ } |
| 780 |
|
| 781 |
ulen = skb->len - sizeof(struct udphdr); |
| 782 |
copied = len; |
| 783 |
--- linux-2.6.32-754.35.1.el6.orig/net/socket.c |
| 784 |
+++ linux-2.6.32-754.35.1.el6/net/socket.c |
| 785 |
@@ -579,6 +579,8 @@ static inline int __sock_sendmsg(struct |
| 786 |
struct msghdr *msg, size_t size) |
| 787 |
{ |
| 788 |
int err = security_socket_sendmsg(sock, msg, size); |
| 789 |
+ if (!err) |
| 790 |
+ err = ccs_socket_sendmsg_permission(sock, msg, size); |
| 791 |
|
| 792 |
return err ?: __sock_sendmsg_nosec(iocb, sock, msg, size); |
| 793 |
} |
| 794 |
@@ -1243,6 +1245,8 @@ int __sock_create(struct net *net, int f |
| 795 |
} |
| 796 |
|
| 797 |
err = security_socket_create(family, type, protocol, kern); |
| 798 |
+ if (!err) |
| 799 |
+ err = ccs_socket_create_permission(family, type, protocol); |
| 800 |
if (err) |
| 801 |
return err; |
| 802 |
|
| 803 |
@@ -1472,6 +1476,11 @@ SYSCALL_DEFINE3(bind, int, fd, struct so |
| 804 |
(struct sockaddr *)&address, |
| 805 |
addrlen); |
| 806 |
if (!err) |
| 807 |
+ err = ccs_socket_bind_permission(sock, |
| 808 |
+ (struct sockaddr *) |
| 809 |
+ &address, |
| 810 |
+ addrlen); |
| 811 |
+ if (!err) |
| 812 |
err = sock->ops->bind(sock, |
| 813 |
(struct sockaddr *) |
| 814 |
&address, addrlen); |
| 815 |
@@ -1501,6 +1510,8 @@ SYSCALL_DEFINE2(listen, int, fd, int, ba |
| 816 |
|
| 817 |
err = security_socket_listen(sock, backlog); |
| 818 |
if (!err) |
| 819 |
+ err = ccs_socket_listen_permission(sock); |
| 820 |
+ if (!err) |
| 821 |
err = sock->ops->listen(sock, backlog); |
| 822 |
|
| 823 |
fput_light(sock->file, fput_needed); |
| 824 |
@@ -1566,6 +1577,10 @@ SYSCALL_DEFINE4(accept4, int, fd, struct |
| 825 |
if (err < 0) |
| 826 |
goto out_fd; |
| 827 |
|
| 828 |
+ if (ccs_socket_post_accept_permission(sock, newsock)) { |
| 829 |
+ err = -EAGAIN; /* Hope less harmful than -EPERM. */ |
| 830 |
+ goto out_fd; |
| 831 |
+ } |
| 832 |
if (upeer_sockaddr) { |
| 833 |
if (newsock->ops->getname(newsock, (struct sockaddr *)&address, |
| 834 |
&len, 2) < 0) { |
| 835 |
@@ -1627,6 +1642,9 @@ SYSCALL_DEFINE3(connect, int, fd, struct |
| 836 |
|
| 837 |
err = |
| 838 |
security_socket_connect(sock, (struct sockaddr *)&address, addrlen); |
| 839 |
+ if (!err) |
| 840 |
+ err = ccs_socket_connect_permission(sock, (struct sockaddr *) |
| 841 |
+ &address, addrlen); |
| 842 |
if (err) |
| 843 |
goto out_put; |
| 844 |
|
| 845 |
--- linux-2.6.32-754.35.1.el6.orig/net/unix/af_unix.c |
| 846 |
+++ linux-2.6.32-754.35.1.el6/net/unix/af_unix.c |
| 847 |
@@ -984,6 +984,9 @@ static int unix_bind(struct socket *sock |
| 848 |
mode = S_IFSOCK | |
| 849 |
(SOCK_INODE(sock)->i_mode & ~current_umask()); |
| 850 |
err = security_path_mknod(&nd.path, dentry, mode, 0); |
| 851 |
+ if (!err) |
| 852 |
+ err = ccs_mknod_permission(dentry, nd.path.mnt, mode, |
| 853 |
+ 0); |
| 854 |
if (err) |
| 855 |
goto out_mknod_dput; |
| 856 |
err = vfs_mknod(nd.path.dentry->d_inode, dentry, mode, 0); |
| 857 |
@@ -1951,6 +1954,10 @@ static int unix_dgram_recvmsg(struct kio |
| 858 |
|
| 859 |
wake_up_interruptible_sync(&u->peer_wait); |
| 860 |
|
| 861 |
+ if (ccs_socket_post_recvmsg_permission(sk, skb, flags)) { |
| 862 |
+ err = -EAGAIN; /* Hope less harmful than -EPERM. */ |
| 863 |
+ goto out_unlock; |
| 864 |
+ } |
| 865 |
if (msg->msg_name) |
| 866 |
unix_copy_addr(msg, skb->sk); |
| 867 |
|
| 868 |
--- linux-2.6.32-754.35.1.el6.orig/security/Kconfig |
| 869 |
+++ linux-2.6.32-754.35.1.el6/security/Kconfig |
| 870 |
@@ -188,5 +188,7 @@ source security/tomoyo/Kconfig |
| 871 |
|
| 872 |
source security/integrity/ima/Kconfig |
| 873 |
|
| 874 |
+source security/ccsecurity/Kconfig |
| 875 |
+ |
| 876 |
endmenu |
| 877 |
|
| 878 |
--- linux-2.6.32-754.35.1.el6.orig/security/Makefile |
| 879 |
+++ linux-2.6.32-754.35.1.el6/security/Makefile |
| 880 |
@@ -25,3 +25,6 @@ obj-$(CONFIG_CGROUP_DEVICE) += device_c |
| 881 |
# Object integrity file lists |
| 882 |
subdir-$(CONFIG_IMA) += integrity/ima |
| 883 |
obj-$(CONFIG_IMA) += integrity/ima/built-in.o |
| 884 |
+ |
| 885 |
+subdir-$(CONFIG_CCSECURITY) += ccsecurity |
| 886 |
+obj-$(CONFIG_CCSECURITY) += ccsecurity/built-in.o |