TOMOYO Linux(undone)

目录

1. TOMOYO Introduction

2. TOMOYO Sourcecode Analysis

1. Introduction

TOMOYO是一款基于LSM Framework实现的LSMs(安全模块)

Relevant Link:

http://lxr.free-electrons.com/source/Documentation/security/tomoyo.txt

2. TOMOYO Sourcecode Analysis

以网络连接状态函数(sys_connect)的监控(tomoyo_socket_connect)的监控log作为例子

/source/security/tomoyo/tomoyo.c

/**
* tomoyo_socket_connect - Check permission for connect().
*
* @sock:     Pointer to "struct socket".
* @addr:     Pointer to "struct sockaddr".
* @addr_len: Size of @addr.
*
* Returns 0 on success, negative value otherwise.
*/
static int tomoyo_socket_connect(struct socket *sock, struct sockaddr *addr, int addr_len)
{
    return tomoyo_socket_connect_permission(sock, addr, addr_len);
}

/source/security/tomoyo/network.c

/**
* tomoyo_sock_family - Get socket‘s family.
*
* @sk: Pointer to "struct sock".
*
* Returns one of PF_INET, PF_INET6, PF_UNIX or 0.
*/
static u8 tomoyo_sock_family(struct sock *sk)
{
     u8 family;

    if (tomoyo_kernel_service())
        return 0;
    family = sk->sk_family;
    switch (family)
    {
        case PF_INET:
        case PF_INET6:
        case PF_UNIX:
            return family;
        default:
            return 0;
    }
}

/**
* tomoyo_socket_connect_permission - Check permission for setting the remote address of a socket.
*
* @sock:     Pointer to "struct socket".
* @addr:     Pointer to "struct sockaddr".
* @addr_len: Size of @addr.
*
* Returns 0 on success, negative value otherwise.
*/
int tomoyo_socket_connect_permission(struct socket *sock, struct sockaddr *addr, int addr_len)
{
    struct tomoyo_addr_info address;
    //Get socket‘s family.(family是链路层的概念)
    const u8 family = tomoyo_sock_family(sock->sk);
    //socket的类型(TCP、UDP...)(type是传输层的概念)
    const unsigned int type = sock->type;

    if (!family)
        return 0;
    address.protocol = type;
    switch (type)
    {
        case SOCK_DGRAM:
        case SOCK_RAW:
            address.operation = TOMOYO_NETWORK_SEND;
            break;
        case SOCK_STREAM:
        case SOCK_SEQPACKET:
            address.operation = TOMOYO_NETWORK_CONNECT;
            break;
        default:
            return 0;
    }
    if (family == PF_UNIX)
        return tomoyo_check_unix_address(addr, addr_len, &address);

    return tomoyo_check_inet_address(addr, addr_len, sock->sk->sk_protocol, &address);
}

/* Structure for holding socket address. */
struct tomoyo_addr_info
{
    u8 protocol;
    u8 operation;
    struct tomoyo_inet_addr_info inet;
    struct tomoyo_unix_addr_info unix0;
};

static int tomoyo_check_inet_address(const struct sockaddr *addr, const unsigned int addr_len, const u16 port, struct tomoyo_addr_info *address)
{
    struct tomoyo_inet_addr_info *i = &address->inet;

    switch (addr->sa_family)
    {
        case AF_INET6:
            if (addr_len < SIN6_LEN_RFC2133)
                goto skip;
            i->is_ipv6 = true;
            i->address = (__be32 *)((struct sockaddr_in6 *) addr)->sin6_addr.s6_addr;
            i->port = ((struct sockaddr_in6 *) addr)->sin6_port;
            break;
        case AF_INET:
            if (addr_len < sizeof(struct sockaddr_in))
                goto skip;
            i->is_ipv6 = false;
            i->address = (__be32 *) &((struct sockaddr_in *) addr)->sin_addr;
            i->port = ((struct sockaddr_in *) addr)->sin_port;
            break;
        default:
            goto skip;
    }
    if (address->protocol == SOCK_RAW)
        i->port = htons(port);
    return tomoyo_inet_entry(address);
    skip:
        return 0;
}

Relevant Link:

Copyright (c) 2014 LittleHann All rights reserved

时间: 2024-10-27 18:52:53

TOMOYO Linux(undone)的相关文章

Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux(undone)

目录 1. sys_call_table:系统调用表 2. 内核符号导出表.kallsyms_lookup_name 3. Linux 32bit.64bit下系统调用入口的异同 1. sys_call_table:系统调用表 Relevant Link: 2. 内核符号导出表.kallsyms_lookup_name Relevant Link: 3. Linux 32bit.64bit下系统调用入口的异同 以sys_execve.sys_socketcall.sys_init_module这

Linux LSM(Linux Security Modules) Hook Technology(undone)

目录 0. 引言 1. Linux Security Module Framework Introduction 2. LSM Sourcecode Analysis 3. LSMs Hook Engine:基于LSM Hook进行元数据的监控获取 4. LSM编程示例 0. 引言 从最佳实践的角度来说,在Linux Kernel中进行安全审计.Access Control(访问控制)最好的方式就是使用Linux提供的原生的框架机制,例如 1. Kprobe: Linux提供的原生的调试机制(D

Linux Security模块

一.Linux Security Modules Linux Security Modules (LSM) 是一种 Linux 内核子系统,旨在将内核以模块形式集成到各种安全模块中.在 2001 年的 Linux Kernel 峰会上,NSA 代表建议在 Linux 内核版本 2.5 中包含强制控制访问系统 Security-Enhanced Linux.然而,Linus Torvalds 拒绝了这一提议,因为 SELinux 并不是惟一一个用于增强 Linux 安全性的安全系统.除此之外,并不

DTE Linux、SELinux与SEAndroid之间的对比分析

2000年,美国威廉玛丽学院的研究人员Serge等人在USENIX的4th annual Linux Showcase &Conference会议上发表了题为"Domainand Type Enforcement for Linux"的文章.该文章第一次将DTE模型用于Linux,实现了DTE Linux原型系统. 同年,美国国家安全局NSA的Stephen Smalley等人发布了开源的Linux安全框架SELinux,SELinux第一个版本基于Linux 2.5内核,并采

Linux Communication Mechanism Summarize(undone)

目录 1. Linux通信机制分类简介 2. Inter-Process Communication (IPC) mechanisms: 进程间通信机制 3. 多线程并行中的阻塞和同步 4. Ring3和Ring0的通信机制 5. 远程网络通信 1. Linux通信机制简介 在开始学习Linux下的通信机制之前,我们先来给通信机制下一个定义,即明白什么是通信机制?为什么要存在通信机制? 0x1: Linux通信目的 1. 数据传输: 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节

linux内核数据结构学习总结(undone)

本文旨在整理内核和应用层分别涉及到的数据结构,从基础数据结构的角度来为内核研究作准备,会在今后的研究中不断补充 目录 1. 进程相关数据结构 1) struct task_struct 2. 内核中的队列/链表对象 3. 内核模块相关数据结构 2) struct module 1. 进程相关数据结构 0x1: task_struct 我们知道,在windows中使用PCB(进程控制块)来对进程的运行状态进行描述,对应的,在linux中使用task_struct结构体存储相关的进程信息,task_

Linux Kernel中获取当前目录方法(undone)

目录 0. 引言 1. 基于进程内存镜像信息struct mm_struct获取struct path调用d_path()获取当前进程的"绝对路径" 2. 基于文件描述符(fd).task_struct调用d_path()获取当前进程的"当前目录" 3. 基于dentry.vfsmount调用d_path()获取当前进程的"当前目录" 4. 基于get_fs_pwd获取当前目录 0. 引言 本文涉及的是ring0下的获取当前进程工作目录的方法,L

Linux Kernel File IO Syscall Kernel-Source-Code Analysis(undone)

目录 0. 引言 1. open() syscall 2. close() syscall 0. 引言 在linux的哲学中,所有的磁盘文件.目录.外设设备.驱动设备全部被抽象为了"文件"这个概念,所以本文提到的"File IO"适用于linux下所有的IO操作,需要明白的的,本文分析的是linux下的IO系统调用对应的内核源代码,linux下每一个系统调用都有对应的内核源代码,而我们在ring3常用的glib c的编程所有的c库API,它们只是对系统调用的一个封装

Linux Default Bootup、Startup、Autoload Configuration file(undone)

目录 1. Linux初始化init系统 2. Linux配置文件自动加载过程 1. Linux初始化init系统 Linux初始化init系统在不同操作系统系列下的区别 1. RHEL 5: SysVinit 2. RHEL 6: Upstart 3. RHEL 7: Systemd RHEL 5.x为例进行学习 RHEL的启动过程按步骤大致可以分为: 1. POST加电自检 2. BIOS(Boot Sequence) 3. 加载对应引导上的MBR(bootloader) 4. 主引导设置加