您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > CISP-14-安全编程
CISP-14-安全编程中国信息安全测评中心2008年11月课程内容•安全编程概述•Windows安全编程•Unix安全编程•脚本安全编程安全编程概述•安全编程基本概念•安全编程基本原则•测试程序安全方法•不安全编程方法•如何编写安全的程序安全编程基本概念什么是一个安全的程序?•简单的说,无论使用何种破坏手段,都可以正确执行自己的既定任务,这样的程序就是安全的程序。•安全程序不应当损害它运行系统的本地安全策略。•程序员职责就是保证程序可以正常执行任务。锁匠与锁,屋主与关门Solaris‘login’的安全问题什么是安全漏洞?•程序中存在的危害本地安全策略的问题或弱点•大多数是指那些会导致程序强制执行一些不同于作者本来意图的行为常见安全漏洞类型•缓冲区溢出•竞争条件•输入检查错误•访问控制错误•设计错误通用安全编程原则•程序只实现你指定的功能•永远不要信任用户输入,对用户输入数据做有效性检查•必须考虑意外情况并进行处理•不要试图在发现错误之后继续执行•尽可能使用安全函数进行编程•小心、认真、细致地编程测试程序安全方法•尝试使程序里的所有缓存溢出•尝试使用任意的命令行选项•尝试建立可能的racecondition•设计者做代码重阅和测试•读所有的代码,象cracker一样思维来找漏洞不安全编程方法•防止使用在处理字符串时不检查buffer边界的函数,如gets(),strcpy(),strcat(),sprintf(),fscanf(),scanf(),vsprintf(),realpath(),getopt(),getpass(),streadd(),strecpy(),和strtrns()•避免使用execlp()和execvp()永远不要用system()和popen()系统调用•不要将文件创建文件在全部人可写的目录里通常,不要设置setuid或者setgid的shellscripts•不要假想端口号码,应该用getservbyname()函数不安全编程方法•假设来自小数字的端口号的连接是合法和可信任的•相信任何IP地址,如果要验证,用密码算法•用明文方式验证信息•尝试从严重的错误中恢复,要输出详细信息然后中断如何编写安全的程序一•检查所有的命令行参数•检查所有的系统调用参数和返回代码•检查环境参数,不要依靠Unix环境变量•确定所有的缓存都被检查过•在变量的内容被拷贝到本地缓存之前对变量进行边界检查•如果创建一个新文件,使用O_EXCL和O_CREATE标志来确定文件没有已经存在•使用lstat()来确定文件不是一个符号连接使用下面的这些库调用:fgets(),strncpy(),strncat(),snprintf()而不是其它类似的函数,可以说,只使用检查了长度的函数.如何编写安全的程序二•同样的,小心的使用execve(),如果你必须衍生一个进程•在程序开始时显式的更改目录(chdir())到适当的地方•限制当程序失败时产生的core文件,core文件里有可能含有密码和其它内存状态信息.•如果使用临时文件,考虑使用系统调用tmpfile()或mktemp()来创建它们(虽然很多mktemp()库调用可能有racecondition的情况)•内部有做完整性检查的代码如何编写安全的程序三•做大量的日志记录,包括日期,时间,uid和effectiveuid,gid和effectivegid,终端信息,pid,命令行参数,错误和主机名•使程序的核心尽可能小和简单•永远用全路径名做文件参数•检查用户的输入,确保只有“好”的字符•使用好的工具如lint理解raceconditions,包括死锁状态和顺序状态•在网络读请求的程序里设置timeouts和负荷级别的限制.•在网络写请求里放置timeouts如何编写安全的程序四•使用会话加密来避免会话抢劫和隐藏验证信息•尽可能使用chroot()设置程序环境•如果可能,静态连接安全程序•当需要主机名时使用DNS逆向解释•在网络服务程序里分散和限制过多的负载在网络的读和写里放置适当的timeout限制如果合适,防止服务程序运行超过一个以上的拷贝课程内容•安全编程概述•Windows安全编程•Unix安全编程•脚本安全编程Windows内部机制•Windows是一个“基于事件的,消息驱动的”操作系统。在Windows下执行一个程序,只要用户进行了影响窗口的动作(如改变窗口大小或移动、单击鼠标等)该动作就会触发一个相应的“事件”。•系统每次检测到一个事件时,就会给程序发送一个“消息”,从而使程序可以处理该事件。•每次检测到一个用户事件,程序就对该事件做出响应,处理完以后,再等待下一个事件的发生。八个基本概念•与Windows系统密切相关的八个基本概念分别是:窗口、程序、进程、线程消息、事件、句柄、API与SDK。winodws安全编程•windows安全编程:Socket编程注册表编程文件系统编程定时器编程驻留程序编程多线程编程。Socket编程•避免服务器被劫持•TCP窗口攻击•选择服务器接口•接受连接•欺骗、基于主机和基于端口信任注册表编程注册表的句柄可以由调用RegOpenKeyEx()和RegCreateKeyEx()函数得到的,通过函数RegQueryValueEx()可以查询注册表某一项的值通过函数RegSetValueEx()可以设置注册表某一项的值。RegCreateKeyEx()函数和RegSetValueEx()函数的使用方法如程序proj3_12.cpp所示。操作注册表程序代码判断是否中了“冰河”程序代码更改系统登录用户程序代码文件系统编程程序代码定时器编程著名的“CIH病毒”每年定时发作,其中需要利用定时器来控制程序的执行。定时器程序分成两大类,•一类是循环执行•另一类是根据条件只执行一次。在程序中加载定时器,如程序proj3_18所示。定时器编程程序代码驻留程序编程内存驻留程序的编写程序代码案例“冰河”原型第一种方法实现起来比较简单,注册表的自启动项的键值在“HKEY_LOCAL_MACHINE”主键下的“SOFTWARE\Microsoft\Windows\CurrentVersion\Run”子键中,如图3-51所示。多线程编程用多线程技术编程有两大优点:1、提高CPU的利用率。由于多线程并发运行,用户在做一件事情的时候还可以做另外一件事。特别是在多个CPU的情况下,更可以充分地利用硬件资源的优势,将一个大任务分成几个任务,由不同的CPU来合作完成。2、采用多线程技术,可以设置每个线程的优先级,调整工作的进度。在实际开发过程中,一定要有一个主进程,其他线程可以共享该进程也可以独立运行,每个线程占用CPU的时间有限制,可以设置运行优先级别。独立线程程序的编写程序代码多个线程共享参数程序代码Linux/Unix内核•Linux和Unix从根本上来说可以分为两部分:内核与“用户空间”。绝大多数程序运行在用户空间(在内核之上)。•内核模块(Linux)•微内核系统(如HURD)基本概念•与unix系统密切相关的基本概念:进程文件SystemV的IPC套接字和网络连接信号配额与限制动态连接库审核Unix安全编程•Unix安全编程:Socket编程注册表编程文件系统编程定时器编程驻留程序编程多线程编程。Web安全编程WebCGI编程的常见问题•信息泄漏泄漏web路径信息泄漏系统文件内容泄漏数据库内容•覆盖、重写系统或者数据库数据•执行系统命令•拒绝服务攻击如何写一个安全的CGI程序防止缓冲区溢出小心调用外部命令特殊字符的过滤正确使用隐藏变量使用cookie应注意的问题提防拒绝服务攻击使用正确的错误处理机制CGI–缓冲区溢出什么是缓冲区溢出?•当向一个固定大小的缓冲区(buffer)中储存超量数据时,就会发生缓冲区溢出(BufferOverflow)缓冲区溢出的后果•如果使用随机数据,可能导致程序崩溃•如果精心构造溢出数据,可能改变程序执行流程,允许攻击者执行任意指令影响语言:C/C++典型案例:count.cgi缓冲区溢出漏洞CGI–外部命令原则•尽可能不调用外部命令•如果不得不调用,必须检查传递给外部命令的参数是否合法。只允许那些完全符合要求的参数通过。下表列出了一些常见调用外部命令的函数表1.C和Perl中可以调用shell的函数.Perl函数C函数system('...')system()open('|...')popen()exec('...')eval('...')CGI–特殊字符(1)原则•只让我们需要的字符通过检测•不是剔除非法字符而是检查是否在合法字符集内不止是在调用外部命令时,在任何时候你都应该检查你页面的输入是否合法,当然这种检测没有一定的规律,要视你的CGI功能而定。要特别注意以下这些字符:;*|`&$!#()[]:{}'“../..\NULLCGI–特殊字符(2)一个非常著名的例子:phf这个CGI程序在以前NCSA和APACHEWEB服务器中是默认安装的。phf程序通过popen()函数来传递数据到程序中剔除了一些已知的不良的字符,但是,它遗漏了其中一个字符:换行符(\n),当在远程主机使用SHELL解程序解析的时候,换行符扮演了命令分隔符,把分行符前字符串作为一个命令,而把换行符后面的字符串作为一个新命令,通过请求下面的ULR,就可能在主机上执行cat/etc/passwd的命令:/cgi-bin/phf?Qalias=hell%0acat%20/etc/passwd%0aCGI-隐藏变量原则•尽量不要使用隐藏变量传递数据•如果必须使用,应当在每个CGI中对所有的隐藏变量都进行检查。在很多CGI程序中,人们喜欢用隐藏变量来传递信息,这容易给一些不怀好意的人以可乘之机,因为隐藏变量可以通过查看html原码看到。因此,在用隐藏变量来传递信息时,一定要小心,审核你的程序流程,看看是否会带来问题。CGI-隐藏变量隐藏变量HIDDEN•隐藏变量的值是用户可修改的•程序员可能忽视对隐藏变量的检查•在多个连续页面中传递隐藏变量时,中间页面可能忽略了对隐藏变量的检查一个隐藏变量BA1.asp-a2.asp-a3.aspA2.asp可能会忘记对其进行检查CGI–Cookie的使用很多人喜欢使用Cookie在客户端存储信息。Cookie的特点•明文保存•用户可控制原则•尽量不要使用Cookie保存敏感信息•设置Cookie的有效时间CGI–拒绝服务攻击拒绝服务攻击是使应用程序或操作系统停止为合法访问提供服务的一种攻击。对于CGI程序的拒绝服务来说,通常是指利用CGI程序实现上的弱点来大量占用系统资源(CPU或内存)•例如,在数据库搜索时,使用简单的select语句对整个数据库进行搜索。当数据库比较庞大时,会占用较多的系统资源。攻击者如果发送大量搜索查询请求,系统可能瘫痪原则:处理请求时,使响应时间和占用资源尽可能少。CGI–错误处理机制如果没有好的错误处理机制,你的CGI程序会在出错时泄露一些有用的信息。•泄漏CGI程序所在物理路径•泄漏数据库结构信息•泄漏一些其他的有用信息,例如用户有效性当输入错误用户名时,返回”该用户不存在”信息原则:尽量不要泄漏任何不必要的信息只要用户名和口令有一样不正确,都显示同样的错误信息。攻击者无法识别有效用户名。PHP安全编程PHP是一种非常容易上手的脚本语言,在web上应用十分广泛。PHP的开发者已经考虑到了很多安全问题,但是在默认安装下,由于程序员的不小心,还是会给服务器造成很大的危险。我们将以攻击者、脚本程序员、网站管理员三种角度讨论PHP的安全。一、PHP变量滥用二、文件打开代码的漏洞三、包含文件PHP的包含函数有include(),include_once(),require(),require_once。如果对包含文件名变量检查
本文标题:CISP-14-安全编程
链接地址:https://www.777doc.com/doc-4368373 .html