3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-01-30 14:52:17 +00:00
Brooklyn/include/linux/grinternal.h
2022-04-02 18:17:33 +05:00

232 lines
9.4 KiB
C

#ifndef __GRINTERNAL_H
#define __GRINTERNAL_H
#ifdef CONFIG_GRKERNSEC
#include <linux/fs.h>
#include <linux/mnt_namespace.h>
#include <linux/nsproxy.h>
#include <linux/gracl.h>
#include <linux/grdefs.h>
#include <linux/grmsg.h>
void gr_add_learn_entry(const char *fmt, ...)
__attribute__ ((format (printf, 1, 2)));
__u32 gr_search_file(const struct dentry *dentry, const __u32 mode,
const struct vfsmount *mnt);
__u32 gr_check_create(const struct dentry *new_dentry,
const struct dentry *parent,
const struct vfsmount *mnt, const __u32 mode);
int gr_check_protected_task(const struct task_struct *task);
__u32 to_gr_audit(const __u32 reqmode);
int gr_set_acls(const int type);
int gr_acl_is_enabled(void);
char gr_roletype_to_char(void);
void gr_handle_alertkill(struct task_struct *task);
char *gr_to_filename(const struct dentry *dentry,
const struct vfsmount *mnt);
char *gr_to_filename1(const struct dentry *dentry,
const struct vfsmount *mnt);
char *gr_to_filename2(const struct dentry *dentry,
const struct vfsmount *mnt);
char *gr_to_filename3(const struct dentry *dentry,
const struct vfsmount *mnt);
extern int grsec_enable_ptrace_readexec;
extern int grsec_enable_harden_ptrace;
extern int grsec_enable_link;
extern int grsec_enable_fifo;
extern int grsec_enable_execve;
extern int grsec_enable_shm;
extern int grsec_enable_execlog;
extern int grsec_enable_signal;
extern int grsec_enable_audit_ptrace;
extern int grsec_enable_forkfail;
extern int grsec_enable_time;
extern int grsec_enable_rofs;
extern int grsec_deny_new_usb;
extern int grsec_enable_chroot_shmat;
extern int grsec_enable_chroot_mount;
extern int grsec_enable_chroot_double;
extern int grsec_enable_chroot_pivot;
extern int grsec_enable_chroot_chdir;
extern int grsec_enable_chroot_chmod;
extern int grsec_enable_chroot_mknod;
extern int grsec_enable_chroot_fchdir;
extern int grsec_enable_chroot_nice;
extern int grsec_enable_chroot_execlog;
extern int grsec_enable_chroot_caps;
extern int grsec_enable_chroot_rename;
extern int grsec_enable_chroot_sysctl;
extern int grsec_enable_chroot_unix;
extern int grsec_enable_symlinkown;
extern kgid_t grsec_symlinkown_gid;
extern int grsec_enable_tpe;
extern kgid_t grsec_tpe_gid;
extern int grsec_enable_tpe_all;
extern int grsec_enable_tpe_invert;
extern int grsec_enable_socket_all;
extern kgid_t grsec_socket_all_gid;
extern int grsec_enable_socket_client;
extern kgid_t grsec_socket_client_gid;
extern int grsec_enable_socket_server;
extern kgid_t grsec_socket_server_gid;
extern kgid_t grsec_audit_gid;
extern int grsec_enable_group;
extern int grsec_enable_log_rwxmaps;
extern int grsec_enable_mount;
extern int grsec_enable_chdir;
extern int grsec_resource_logging;
extern int grsec_enable_blackhole;
extern int grsec_lastack_retries;
extern int grsec_enable_brute;
extern int grsec_enable_harden_ipc;
extern int grsec_enable_harden_tty;
extern int grsec_lock;
extern spinlock_t grsec_alert_lock;
extern unsigned long grsec_alert_wtime;
extern unsigned long grsec_alert_fyet;
extern spinlock_t grsec_audit_lock;
extern rwlock_t grsec_exec_file_lock;
#define gr_task_fullpath(tsk) ((tsk)->exec_file ? \
gr_to_filename2((tsk)->exec_file->f_path.dentry, \
(tsk)->exec_file->f_path.mnt) : "/")
#define gr_parent_task_fullpath(tsk) ((tsk)->real_parent->exec_file ? \
gr_to_filename3((tsk)->real_parent->exec_file->f_path.dentry, \
(tsk)->real_parent->exec_file->f_path.mnt) : "/")
#define gr_task_fullpath0(tsk) ((tsk)->exec_file ? \
gr_to_filename((tsk)->exec_file->f_path.dentry, \
(tsk)->exec_file->f_path.mnt) : "/")
#define gr_parent_task_fullpath0(tsk) ((tsk)->real_parent->exec_file ? \
gr_to_filename1((tsk)->real_parent->exec_file->f_path.dentry, \
(tsk)->real_parent->exec_file->f_path.mnt) : "/")
#define proc_is_chrooted(tsk_a) ((tsk_a)->gr_is_chrooted)
#define have_same_root(tsk_a,tsk_b) ((tsk_a)->gr_chroot_dentry == (tsk_b)->gr_chroot_dentry)
static inline bool gr_is_same_file(const struct file *file1, const struct file *file2)
{
if (file1 && file2) {
const struct inode *inode1 = file1->f_path.dentry->d_inode;
const struct inode *inode2 = file2->f_path.dentry->d_inode;
if (inode1->i_ino == inode2->i_ino && inode1->i_sb->s_dev == inode2->i_sb->s_dev)
return true;
}
return false;
}
#define GR_CHROOT_CAPS {{ \
CAP_TO_MASK(CAP_LINUX_IMMUTABLE) | CAP_TO_MASK(CAP_NET_ADMIN) | \
CAP_TO_MASK(CAP_SYS_MODULE) | CAP_TO_MASK(CAP_SYS_RAWIO) | \
CAP_TO_MASK(CAP_SYS_PACCT) | CAP_TO_MASK(CAP_SYS_ADMIN) | \
CAP_TO_MASK(CAP_SYS_BOOT) | CAP_TO_MASK(CAP_SYS_TIME) | \
CAP_TO_MASK(CAP_NET_RAW) | CAP_TO_MASK(CAP_SYS_TTY_CONFIG) | \
CAP_TO_MASK(CAP_IPC_OWNER) | CAP_TO_MASK(CAP_SETFCAP), \
CAP_TO_MASK(CAP_SYSLOG) | CAP_TO_MASK(CAP_MAC_ADMIN) }}
#define security_learn(normal_msg,args...) \
({ \
read_lock(&grsec_exec_file_lock); \
gr_add_learn_entry(normal_msg "\n", ## args); \
read_unlock(&grsec_exec_file_lock); \
})
enum {
GR_DO_AUDIT,
GR_DONT_AUDIT,
/* used for non-audit messages that we shouldn't kill the task on */
GR_DONT_AUDIT_GOOD
};
enum {
GR_TTYSNIFF,
GR_RBAC,
GR_RBAC_STR,
GR_STR_RBAC,
GR_RBAC_MODE2,
GR_RBAC_MODE3,
GR_FILENAME,
GR_SYSCTL_HIDDEN,
GR_NOARGS,
GR_ONE_INT,
GR_ONE_INT_TWO_STR,
GR_ONE_STR,
GR_STR_INT,
GR_TWO_STR_INT,
GR_TWO_INT,
GR_TWO_U64,
GR_THREE_INT,
GR_FIVE_INT_TWO_STR,
GR_TWO_STR,
GR_THREE_STR,
GR_FOUR_STR,
GR_STR_FILENAME,
GR_FILENAME_STR,
GR_FILENAME_TWO_INT,
GR_FILENAME_TWO_INT_STR,
GR_TEXTREL,
GR_PTRACE,
GR_RESOURCE,
GR_CAP,
GR_SIG,
GR_SIG2,
GR_CRASH1,
GR_CRASH2,
GR_PSACCT,
GR_RWXMAP,
GR_RWXMAPVMA
};
#define gr_log_hidden_sysctl(audit, msg, str) gr_log_varargs(audit, msg, GR_SYSCTL_HIDDEN, str)
#define gr_log_ttysniff(audit, msg, task) gr_log_varargs(audit, msg, GR_TTYSNIFF, task)
#define gr_log_fs_rbac_generic(audit, msg, dentry, mnt) gr_log_varargs(audit, msg, GR_RBAC, dentry, mnt)
#define gr_log_fs_rbac_str(audit, msg, dentry, mnt, str) gr_log_varargs(audit, msg, GR_RBAC_STR, dentry, mnt, str)
#define gr_log_fs_str_rbac(audit, msg, str, dentry, mnt) gr_log_varargs(audit, msg, GR_STR_RBAC, str, dentry, mnt)
#define gr_log_fs_rbac_mode2(audit, msg, dentry, mnt, str1, str2) gr_log_varargs(audit, msg, GR_RBAC_MODE2, dentry, mnt, str1, str2)
#define gr_log_fs_rbac_mode3(audit, msg, dentry, mnt, str1, str2, str3) gr_log_varargs(audit, msg, GR_RBAC_MODE3, dentry, mnt, str1, str2, str3)
#define gr_log_fs_generic(audit, msg, dentry, mnt) gr_log_varargs(audit, msg, GR_FILENAME, dentry, mnt)
#define gr_log_noargs(audit, msg) gr_log_varargs(audit, msg, GR_NOARGS)
#define gr_log_int(audit, msg, num) gr_log_varargs(audit, msg, GR_ONE_INT, num)
#define gr_log_int_str2(audit, msg, num, str1, str2) gr_log_varargs(audit, msg, GR_ONE_INT_TWO_STR, num, str1, str2)
#define gr_log_str(audit, msg, str) gr_log_varargs(audit, msg, GR_ONE_STR, str)
#define gr_log_str_int(audit, msg, str, num) gr_log_varargs(audit, msg, GR_STR_INT, str, num)
#define gr_log_int_int(audit, msg, num1, num2) gr_log_varargs(audit, msg, GR_TWO_INT, num1, num2)
#define gr_log_two_u64(audit, msg, num1, num2) gr_log_varargs(audit, msg, GR_TWO_U64, num1, num2)
#define gr_log_int3(audit, msg, num1, num2, num3) gr_log_varargs(audit, msg, GR_THREE_INT, num1, num2, num3)
#define gr_log_int5_str2(audit, msg, num1, num2, str1, str2) gr_log_varargs(audit, msg, GR_FIVE_INT_TWO_STR, num1, num2, str1, str2)
#define gr_log_str_str(audit, msg, str1, str2) gr_log_varargs(audit, msg, GR_TWO_STR, str1, str2)
#define gr_log_str2_int(audit, msg, str1, str2, num) gr_log_varargs(audit, msg, GR_TWO_STR_INT, str1, str2, num)
#define gr_log_str3(audit, msg, str1, str2, str3) gr_log_varargs(audit, msg, GR_THREE_STR, str1, str2, str3)
#define gr_log_str4(audit, msg, str1, str2, str3, str4) gr_log_varargs(audit, msg, GR_FOUR_STR, str1, str2, str3, str4)
#define gr_log_str_fs(audit, msg, str, dentry, mnt) gr_log_varargs(audit, msg, GR_STR_FILENAME, str, dentry, mnt)
#define gr_log_fs_str(audit, msg, dentry, mnt, str) gr_log_varargs(audit, msg, GR_FILENAME_STR, dentry, mnt, str)
#define gr_log_fs_int2(audit, msg, dentry, mnt, num1, num2) gr_log_varargs(audit, msg, GR_FILENAME_TWO_INT, dentry, mnt, num1, num2)
#define gr_log_fs_int2_str(audit, msg, dentry, mnt, num1, num2, str) gr_log_varargs(audit, msg, GR_FILENAME_TWO_INT_STR, dentry, mnt, num1, num2, str)
#define gr_log_textrel_ulong_ulong(audit, msg, str, file, ulong1, ulong2) gr_log_varargs(audit, msg, GR_TEXTREL, str, file, ulong1, ulong2)
#define gr_log_ptrace(audit, msg, task) gr_log_varargs(audit, msg, GR_PTRACE, task)
#define gr_log_res_ulong2_str(audit, msg, task, ulong1, str, ulong2) gr_log_varargs(audit, msg, GR_RESOURCE, task, ulong1, str, ulong2)
#define gr_log_cap(audit, msg, task, str) gr_log_varargs(audit, msg, GR_CAP, task, str)
#define gr_log_sig_addr(audit, msg, str, addr) gr_log_varargs(audit, msg, GR_SIG, str, addr)
#define gr_log_sig_task(audit, msg, task, num) gr_log_varargs(audit, msg, GR_SIG2, task, num)
#define gr_log_crash1(audit, msg, task, ulong) gr_log_varargs(audit, msg, GR_CRASH1, task, ulong)
#define gr_log_crash2(audit, msg, task, ulong1) gr_log_varargs(audit, msg, GR_CRASH2, task, ulong1)
#define gr_log_procacct(audit, msg, task, num1, num2, num3, num4, num5, num6, num7, num8, num9) gr_log_varargs(audit, msg, GR_PSACCT, task, num1, num2, num3, num4, num5, num6, num7, num8, num9)
#define gr_log_rwxmap(audit, msg, str) gr_log_varargs(audit, msg, GR_RWXMAP, str)
#define gr_log_rwxmap_vma(audit, msg, str) gr_log_varargs(audit, msg, GR_RWXMAPVMA, str)
void gr_log_varargs(int audit, const char *msg, int argtypes, ...);
#endif
#endif