码迷,mamicode.com
首页 > 其他好文 > 详细

安胜安全操作系统的隐蔽通道场景演示之二【最近访问时间信道】

时间:2015-04-28 09:50:36      阅读:619      评论:0      收藏:0      [点我收藏+]

标签:操作系统   linux内核   安全   学术   隐蔽通道   

一、实验目的


1.    熟悉安胜安全操作系统的运行环境

2.    熟悉隐蔽通道的工作原理


二、实验内容


1.完成发送和接收程序的编写、编译和执行

2.演示存在的隐蔽通道场景:

 技术分享


三、实验过程、结果


(1)测试准备


1. 启动到隐蔽通道处理前的安全核SecLinux

2. 创建两个用户user_h和user_l,user_h的安全范畴包含user_l的安全范畴,user_h的安全级高于user_l的安全级。此外,设置用户主目录安全级与用户安全级相同;将两个用户主目录自主访问控制权限放开,即均通过chmod命令将其权限设为0777,允许u,g,o可读、写和执行。

3. 检验SecLinux的安全性:

高级用户可以读低安全级文件,但是不能创建低安全级文件,也不能通过拷贝等方式向下传递信息。低级用户无法读高安全级文件。

 

(2)选用的隐蔽通道:最近访问时间信道


信道名称:

最近访问时间信道


信道类型:

 常驻内存型


中介变量:

数据结构stat的st_atime成员


存在条件:

当用户进程访问一个文件时,系统内核都会更新该文件的最近访问时间。同时,系统的安全策略允许高安全级用户读访问低安全级的文件,而低安全级的可以察觉这种访问。


发送方动作:

发送方读取机密文件,然后,根据该文件内容的当前字节的ASIIC码决定要访问的低级用户的文件数目。


接受方动作:

 首先确定一组高级用户可以读的文件。使用系统调用stat读取这些文件的最近访问时间信息,作为原始信息记录下来。待高级用户发送完消息后,使用系统调用stat读取这些文件的最近访问时间信息,并与原始信息比较,将最近访问事件有变化的时间记录目录解释为ASIIC码值。


噪音情况:

出现噪音的原因主要是接收方在接收的CPU时间片可能会不够用。


带宽估计:

不小于30比特/秒。


处理措施:

主要依靠审计方法。


标记变量:

CC_AT

 

(3)同步机制


采用sleep(秒)/usleep(微秒)制造同步。

当一个进程sleep时,就将cpu的控制权交给其他进程,直到sleep时间已到,重新获得cpu的控制权。

这种同步技术容易实现,适于演示。

但是由于进程发送不同字符所用时间不同,而sleep时间一旦指定就是固定的,不能在程序运行期间更改,因此这种同步必然造成时间浪费。

 

(4)实验结果


如下图所示,左侧是发送端at_sender,右侧是接收端at_receiver,发送端从同目录的sender_text.txt文件获取发送数据,通过隐蔽通道发送到接收端,接收端接到数据后保存到同目录的receiver_text.txt文件中,发送端文件中存放的数据是abcdefg。


技术分享



从下图可以看到receiver_text.txt的内容,可以看出,7个字符abcdefg都正确传输。


技术分享



(5)发送端源代码

#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>


void accessFiles(int count);
void sendChar(char ch);


int main()
{
<span style="white-space:pre">	</span>char ch;
<span style="white-space:pre">	</span>FILE *fp;


<span style="white-space:pre">	</span>if ((fp = fopen("./sender_text.txt", "r")) == NULL) //打开要发送的文件
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>printf("fopen error.\n");
<span style="white-space:pre">		</span>exit(0);
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>while ((ch = fgetc(fp)) != EOF)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>sendChar(ch); //每隔2秒发送每一个字符ch
<span style="white-space:pre">		</span>sleep(2);
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>accessFiles(128); //将所有文件访问时间同步,作为结束发送的标识


<span style="white-space:pre">	</span>fclose(fp);
    return 0;
}


void accessFiles(int count)
{
<span style="white-space:pre">	</span>FILE *fp;
<span style="white-space:pre">	</span>char name_tag[25];
<span style="white-space:pre">	</span>char tmp;
<span style="white-space:pre">	</span>int i;


<span style="white-space:pre">	</span>for (i = 0; i < count; i++) //读取前count个文件,从而修改其访问时间
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>sprintf(name_tag, "./tmp/%d.txt", i);
<span style="white-space:pre">		</span>if ((fp = fopen(name_tag, "r")) == NULL)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>printf("fopen error.\n");
<span style="white-space:pre">			</span>exit(0);
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>tmp = fgetc(fp);


<span style="white-space:pre">		</span>fclose(fp);
<span style="white-space:pre">	</span>}
}


void sendChar(char ch) //字符发送函数,通过创建ch个进程表示发送字符ch,这些进程持续2秒
{
<span style="white-space:pre">	</span>printf("Sending char: [%c].\n", ch);
<span style="white-space:pre">	</span>accessFiles((int) ch);
}

 

(6)接收端源代码

#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>


int bStart = 0;
void createFiles();
char checkFiles();
char receiveChar();
void writeToFile(char ch);


int main()
{
<span style="white-space:pre">	</span>char ch;


<span style="white-space:pre">	</span>remove("./receiver_text.txt"); //先删除之前接受的文件
<span style="white-space:pre">	</span>createFiles(); //创建中间文件


<span style="white-space:pre">	</span>while (((ch = receiveChar()) != (char) 0) || bStart == 0)
<span style="white-space:pre">	</span>{ //每隔2秒接受一次字符
<span style="white-space:pre">		</span>if (bStart == 0)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>printf("Not start.\n"); //bStart为0表示发送端还没开始发送
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>else
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>printf("Write [%c] to file.\n", ch); //接收到发送端发送字符ch
<span style="white-space:pre">			</span>writeToFile(ch); //将ch写入接收文件
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>printf("End.\n");


<span style="white-space:pre">	</span>return 0;
}


void createFiles()
{
<span style="white-space:pre">	</span>FILE *fp;
<span style="white-space:pre">	</span>char name_tag[25];
<span style="white-space:pre">	</span>int i;


<span style="white-space:pre">	</span>for (i = 0; i < 128; i++) //由于ASCII码有128个字符,因此这里创建128个文件
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>sprintf(name_tag, "./tmp/%d.txt", i);
<span style="white-space:pre">		</span>if ((fp = fopen(name_tag, "w+")) == NULL)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>printf("fopen error.\n");
<span style="white-space:pre">			</span>exit(0);
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>fputc('t', fp); //文件内容为"test"
<span style="white-space:pre">		</span>fputc('e', fp);
<span style="white-space:pre">		</span>fputc('s', fp);
<span style="white-space:pre">		</span>fputc('t', fp);


<span style="white-space:pre">		</span>fclose(fp);
<span style="white-space:pre">	</span>}
}


char checkFiles() {
<span style="white-space:pre">	</span>struct stat buf;
<span style="white-space:pre">	</span>int result;
<span style="white-space:pre">	</span>int old_time_int = -1;
<span style="white-space:pre">	</span>int time_int;
<span style="white-space:pre">	</span>char name_tag[25];
<span style="white-space:pre">	</span>char ch;
<span style="white-space:pre">	</span>int i;


<span style="white-space:pre">	</span>for (i = 0; i < 128; i++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>sprintf(name_tag, "./tmp/%d.txt", i);
<span style="white-space:pre">		</span>result = stat(name_tag, &buf); //获取文件信息到buf中


<span style="white-space:pre">		</span>if (result != 0)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>printf("checkFiles error.\n");
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>else
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>time_int = buf.st_atime; //获取文件的访问时间
<span style="white-space:pre">			</span>//printf("File: [%s], Access time: [%d].\n", name_tag, time_int);


<span style="white-space:pre">			</span>if (old_time_int != -1 && old_time_int - time_int > 1) //当前后文件的访问时间相差大于1秒时,之前的文件就是发送方访问过的文件
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>ch = (char) i;
<span style="white-space:pre">				</span>printf("File: [%s], access time: [%d], previous file acces time: [%d].\n", name_tag, time_int, old_time_int);
<span style="white-space:pre">				</span>printf("Updated file: [%d], Receiving char: [%c].\n", i, ch);
<span style="white-space:pre">				</span>bStart = 1; //这时发送已经开始,等待触发发送结束标志
<span style="white-space:pre">				</span>return ch;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>old_time_int = time_int;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>return 0;
}


char receiveChar()
{
<span style="white-space:pre">	</span>sleep(2); //每隔2秒接收一次字符
<span style="white-space:pre">	</span>return checkFiles();
}


void writeToFile(char ch) //将ch写入接收文件
{
<span style="white-space:pre">	</span>FILE *fp;
<span style="white-space:pre">	</span>if ((fp = fopen("./receiver_text.txt", "a")) == NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>printf("fopen error.\n");
<span style="white-space:pre">		</span>exit(0);
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>fputc(ch, fp);


<span style="white-space:pre">	</span>fclose(fp);
}

 

四、实验总结


实验收获:


学到了很多隐蔽通道方面的知识,也进一步熟悉了安胜操作系统的命令用法。


总结实验过程中遇到的问题及解决方法:


在linux中开发C语言程序没有好用的IDE,编程非常不便。


解决方案:


在linux中用samba共享,将linux中的C语言代码共享在Windows下,这样可以在Windows下用Visual Studio等专业IDE对源代码进行编辑,保证了编码工作的高效进行。在编码完成后,用linux的scp工具进行文件传输,如下图所示:


技术分享


安胜安全操作系统的隐蔽通道场景演示之二【最近访问时间信道】

标签:操作系统   linux内核   安全   学术   隐蔽通道   

原文地址:http://blog.csdn.net/hsluoyc/article/details/45317693

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!