技术笔记: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

相关文章
|
4月前
|
Linux 开发工具 C++
技术笔记:NanoGUI使用
技术笔记:NanoGUI使用
26 0
|
4月前
|
存储 安全 数据安全/隐私保护
技术笔记:mft(转载)
技术笔记:mft(转载)
24 0
|
4月前
|
前端开发 JavaScript
技术笔记:waitFor和waitForAny的实现
技术笔记:waitFor和waitForAny的实现
32 0
|
4月前
|
存储 数据库 数据安全/隐私保护
技术笔记:MouStudio技术储备之
技术笔记:MouStudio技术储备之
18 0
|
4月前
|
监控 安全 Unix
技术笔记:libev学习(一)
技术笔记:libev学习(一)
24 0
|
4月前
|
存储 JSON NoSQL
技术笔记:Stargate入门
技术笔记:Stargate入门
44 0
|
4月前
技术笔记:Netd学习笔记
技术笔记:Netd学习笔记
18 0
|
4月前
|
前端开发 关系型数据库 MySQL
技术好文:R基础学习(三)
技术好文:R基础学习(三)
20 0
|
4月前
技术笔记:tcolorbox宏包简明教程
技术笔记:tcolorbox宏包简明教程
111 0
|
存储 机器学习/深度学习 自然语言处理
检索技术核心-极客课程笔记
检索技术核心-极客课程笔记
192 0
检索技术核心-极客课程笔记
下一篇
无影云桌面