目录

  1. . TOMOYO Introduction
  2. . TOMOYO Sourcecode Analysis

1. Introduction

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

Relevant Link:

  1. 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

  1. /**
  2. * tomoyo_socket_connect - Check permission for connect().
  3. *
  4. * @sock: Pointer to "struct socket".
  5. * @addr: Pointer to "struct sockaddr".
  6. * @addr_len: Size of @addr.
  7. *
  8. * Returns 0 on success, negative value otherwise.
  9. */
  10. static int tomoyo_socket_connect(struct socket *sock, struct sockaddr *addr, int addr_len)
  11. {
  12. return tomoyo_socket_connect_permission(sock, addr, addr_len);
  13. }

/source/security/tomoyo/network.c

  1. /**
  2. * tomoyo_sock_family - Get socket's family.
  3. *
  4. * @sk: Pointer to "struct sock".
  5. *
  6. * Returns one of PF_INET, PF_INET6, PF_UNIX or 0.
  7. */
  8. static u8 tomoyo_sock_family(struct sock *sk)
  9. {
  10. u8 family;
  11.  
  12. if (tomoyo_kernel_service())
  13. return 0;
  14. family = sk->sk_family;
  15. switch (family)
  16. {
  17. case PF_INET:
  18. case PF_INET6:
  19. case PF_UNIX:
  20. return family;
  21. default:
  22. return 0;
  23. }
  24. }
  25.  
  26. /**
  27. * tomoyo_socket_connect_permission - Check permission for setting the remote address of a socket.
  28. *
  29. * @sock: Pointer to "struct socket".
  30. * @addr: Pointer to "struct sockaddr".
  31. * @addr_len: Size of @addr.
  32. *
  33. * Returns 0 on success, negative value otherwise.
  34. */
  35. int tomoyo_socket_connect_permission(struct socket *sock, struct sockaddr *addr, int addr_len)
  36. {
  37. struct tomoyo_addr_info address;
  38. //Get socket's family.(family是链路层的概念)
  39. const u8 family = tomoyo_sock_family(sock->sk);
  40. //socket的类型(TCP、UDP...)(type是传输层的概念)
  41. const unsigned int type = sock->type;
  42.  
  43. if (!family)
  44. return 0;
  45. address.protocol = type;
  46. switch (type)
  47. {
  48. case SOCK_DGRAM:
  49. case SOCK_RAW:
  50. address.operation = TOMOYO_NETWORK_SEND;
  51. break;
  52. case SOCK_STREAM:
  53. case SOCK_SEQPACKET:
  54. address.operation = TOMOYO_NETWORK_CONNECT;
  55. break;
  56. default:
  57. return 0;
  58. }
  59. if (family == PF_UNIX)
  60. return tomoyo_check_unix_address(addr, addr_len, &address);
  61.  
  62. return tomoyo_check_inet_address(addr, addr_len, sock->sk->sk_protocol, &address);
  63. }
  64.  
  65. /* Structure for holding socket address. */
  66. struct tomoyo_addr_info
  67. {
  68. u8 protocol;
  69. u8 operation;
  70. struct tomoyo_inet_addr_info inet;
  71. struct tomoyo_unix_addr_info unix0;
  72. };
  73.  
  74. static int tomoyo_check_inet_address(const struct sockaddr *addr, const unsigned int addr_len, const u16 port, struct tomoyo_addr_info *address)
  75. {
  76. struct tomoyo_inet_addr_info *i = &address->inet;
  77.  
  78. switch (addr->sa_family)
  79. {
  80. case AF_INET6:
  81. if (addr_len < SIN6_LEN_RFC2133)
  82. goto skip;
  83. i->is_ipv6 = true;
  84. i->address = (__be32 *)((struct sockaddr_in6 *) addr)->sin6_addr.s6_addr;
  85. i->port = ((struct sockaddr_in6 *) addr)->sin6_port;
  86. break;
  87. case AF_INET:
  88. if (addr_len < sizeof(struct sockaddr_in))
  89. goto skip;
  90. i->is_ipv6 = false;
  91. i->address = (__be32 *) &((struct sockaddr_in *) addr)->sin_addr;
  92. i->port = ((struct sockaddr_in *) addr)->sin_port;
  93. break;
  94. default:
  95. goto skip;
  96. }
  97. if (address->protocol == SOCK_RAW)
  98. i->port = htons(port);
  99. return tomoyo_inet_entry(address);
  100. skip:
  101. return 0;
  102. }

Relevant Link:

Copyright (c) 2014 LittleHann All rights reserved

TOMOYO Linux(undone)的更多相关文章

  1. Linux LSM(Linux Security Modules) Hook Technology

    目录 . 引言 . Linux Security Module Framework Introduction . LSM Sourcecode Analysis . LSMs Hook Engine: ...

  2. Linux Security模块

    一.Linux Security Modules Linux Security Modules (LSM) 是一种 Linux 内核子系统,旨在将内核以模块形式集成到各种安全模块中.在 2001 年的 ...

  3. Logical Volume Manager (Linux)

    http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) Logical Volume Manager (Linux) From Wiki ...

  4. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  5. Linaro/Yocto/Openwrt

    http://en.wikipedia.org/wiki/Linaro Linaro From Wikipedia, the free encyclopedia     This article ap ...

  6. Linux inode && Fast Directory Travel Method(undone)

    目录 . Linux inode简介 . Fast Directory Travel Method 1. Linux inode简介 0x1: 磁盘分割原理 字节 -> 扇区(sector)(每 ...

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

    目录 . 引言 . open() syscall . close() syscall 0. 引言 在linux的哲学中,所有的磁盘文件.目录.外设设备.驱动设备全部被抽象为了"文件" ...

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

    目录 . 引言 . 基于进程内存镜像信息struct mm_struct获取struct path调用d_path()获取当前进程的"绝对路径" . 基于文件描述符(fd).tas ...

  9. Linux Cache Mechanism Summary(undone)

    目录 . 缓存机制简介 . 内核缓存机制 . 内存缓存机制 . 文件缓存机制 . 数据库缓存机制 1. 缓存机制简介 0x1: 什么是缓存cache 在计算机整个领域中,缓存(cache)这个词是一个 ...

随机推荐

  1. IO流的练习3 —— 复制多级文件夹下的指定文件并改名

    需求:复制指定目录下的指定文件,并修改后缀名. 指定的文件是:.java文件. 指定的后缀名是:.jad 数据源所在文件夹:C:\Users\Administrator\Desktop\记录 目的地所 ...

  2. 转:webRTC的前世今生

    https://blog.coding.net/blog/getting-started-with-webrtc

  3. ArcGis 中MapControl 框选

    void mCtrl_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)    ...

  4. page-cache层以及各种标志位之间的转换

    对真实文件系统层,算是懂了,但是vfs层以及block层还是有点生疏呢,最近要好好分析一下了. page-cache层主要关注文件读写时的行为,包括页的状态之间的变化,何时变脏,何时变成writeba ...

  5. 【MFC】序列化(Serialize)、反序列化(Deserialize)

    1.首先在头文件里面声明 DECLARE_SERIAL(CSelectionSerial) 2.重写CObject的Serialize函数 virtual void Serialize(CArchiv ...

  6. jQuery调用WCF服务传递JSON对象

    下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...

  7. 20145208 《Java程序设计》第10周学习总结

    20145208 <Java程序设计>第10周学习总结 教材学习内容总结 了解JAVA网络编程的基础知识 这一部分知识的学习在我的实验中有叙述实验五 补充内容: 在现有的网络中,网络通讯的 ...

  8. win7 多点触摸USB的触摸屏

    USB.C 读取bCommon判断执行哪个动作 if (bCommon & rbRSUINT)//0x02 // Handle Resume interrupt { Usb_Resume(); ...

  9. 【hello,world 也打脸】记storm-starter在某知名IDE下的悲催调试经历

    背景 最近收到这样一个问题: Storm处理消息时会根据Topology生成一棵消息树,Storm如何跟踪每个消息.如何保证消息不丢失以及如何实现重发消息机制? 虽已回复,但心想还是看下storm这块 ...

  10. 原生JS、CSS实现的转盘效果(目前仅支持webkit)

    这是一个原生JS.CSS实现的转盘效果(题目在这:http://www.cnblogs.com/arfeizhang/p/turntable.html),花了半个小时左右,准备睡觉,所以先贴一段代码, ...