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

相关文章
|
8月前
|
Linux 开发工具 C++
技术笔记:RustGUI编程
技术笔记:RustGUI编程
|
3月前
|
存储 Java PHP
PHP编程之旅:从基础到实战
【10月更文挑战第23天】本文将带你走进PHP的世界,探索这个流行的服务器端脚本语言的魅力。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和实用的代码示例。我们将从PHP的基本概念开始,然后深入到实际应用中,最后通过一个实战项目来巩固所学知识。让我们一起开启这段激动人心的PHP编程之旅吧!
30 0
|
4月前
|
机器学习/深度学习 人工智能 Kubernetes
技术探索之旅:从基础到进阶的心得体会
本文记录了作者在技术领域的学习和实践过程中积累的经验与感悟。文章涵盖了从基础知识的学习、项目实践,到新技术的探索与应用,最终总结出几点对未来技术发展的思考。希望这些分享能够启发更多的技术爱好者,共同进步。
|
6月前
|
算法 程序员
技术之路:从新手到大师的演变之旅
【8月更文挑战第16天】在技术的浩瀚海洋中,每一个程序员都是一位航行者。本文将带您领略一位技术人员的成长历程,从最初的摸索到成为领域专家的过程。我们将探讨如何通过不断学习和实践,克服挑战,提升技能,并实现个人职业生涯的飞跃。
47 1
|
7月前
|
设计模式 算法 开发者
探索代码之美:从小白到专家的技术之旅
【7月更文挑战第17天】在数字化时代的浪潮中,编程已成为一门不可或缺的技能。本文将通过个人的技术成长历程,探讨如何从一名初学者逐步成长为技术专家。我们将深入讨论基础知识的重要性、持续学习的动力、实践与项目经验的积累,以及社区参与的价值。文章旨在为那些渴望在技术领域内不断进步的人们提供一份指南和灵感。
|
8月前
|
Linux 开发工具 C++
技术笔记:NanoGUI使用
技术笔记:NanoGUI使用
112 0
|
8月前
|
数据可视化 BI OLAP
技术经验分享:DundasBI简介
技术经验分享:DundasBI简介
55 0
|
存储 算法 C++
学习C++笔记429
C++ STL 教程
79 0
|
移动开发 C++
学习C++笔记422
C++ Web 编程
89 0