技术笔记:TOMOYOLinux(undone)

简介: 技术笔记:TOMOYOLinux(undone)

目录


1. TOMOYO Introduction


2. TOMOYO Sourcecode Analysis


1. Introduction


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


Relevant Link:


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:


//代码效果参考:http://www.lyjsj.net.cn/wx/art_23128.html

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 = //代码效果参考:http://www.lyjsj.net.cn/wz/art_23126.html

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 [span style="color: rgba(0, 0, 0, 1)"> 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

相关文章
|
C++
学习C++笔记432
C++ STL 教程
118 0
|
C++
学习C++笔记421
C++ Web 编程
111 0
|
iOS开发 C++
学习C++笔记329
C++ 文件和流
93 0
|
算法 C++
学习C++笔记322
C++ 接口(抽象类)
95 0
|
C++
学习C++笔记315
C++ 数据抽象
67 0
|
安全 C++
学习C++笔记258
C++ 日期 & 时间
113 0
|
C++
学习C++笔记230
C++ 指针
94 0
|
C++
学习C++笔记225
C++ 字符串
97 0
|
C++
学习C++笔记201
C++ 字符串
121 0
|
C++
学习C++笔记198
C++ 数组
98 0