软件安全设计

本文探讨了软件设计中的安全要素,包括总体和详细设计,强调软件安全设计的重要性,阐述了盐zer和Schroeder以及Johnviga和GaryMcgraw的安全设计原则。此外,介绍了应用安全功能设计,如身份认证、授权、输入验证等,并概述了基于安全模式的软件设计方法。威胁建模部分解释了其概念、流程,以及如何通过威胁建模发现和缓解风险。
摘要由CSDN通过智能技术生成

一、软件设计与软件安全设计

1、软件设计的主要工作

1)总体设计和详细设计

  • 总体设计:是指根据需求确定软件和数据的总体框架,包括系统设计过程和结构设计过程。
  • 详细设计:是将总体设计的结果进一步详细的分化为软甲的算法标识和数据结构。

2)主要工作
从技术的角度来看软件设计阶段的主要工作包括:软件架构设计、界面接口设计、模块/子系统设计、数据模型设计、过程/算法设计及部署设计等。

2、软件安全设计的主要工作

1)软件安全设计的目的与作用
软件安全设计的目的在于将安全属性设计到软件架构中去,以实现软件产品本质的安全性。
软件安全设计对于软件安全有着举足轻重的作用,大多数软件安全问题都是由于软件设计上的安全性考虑不足或不完整导致的。

2)软件设计与软件安全设计的关系
简单的说,软件安全设计就是将软件的安全需求转化为软件的功能结构 的过程。软件设计通常包括架构设计、接口设计、算法设计等,这意味着软件安全设计也不仅要考虑系统架构及相关安全问题,同时还要考虑如何将安全需求嵌入到开发架构中去与软件融为一个整体,高效的提供安全服务。

3)软件架构的安全性设计
软件的架构通常分为以下三种:

  • 逻辑架构:描述软件系统中组件的关系,如用户界面、数据库和外部接口等。
  • 物理架构:描述软件组件在硬件上的部署模式。
  • 系统架构:说明系统的功能性特征,若可拓展性、可靠性、灵活性等。

二、软件安全设计原则

1、经典的设计原则

1)saltzer和Schroeder提出的安全设计8条原则:

  • 经济性
  • 默认安全配置
  • 完全控制
  • 开放设计
  • 权限分离
  • 最小特权
  • 最少共用机制
  • 心理可接受

2)John viga 和 Gary Mcgraw总结的10条设计原则

  • 保护最弱的一环
  • 纵深防御
  • 是小安全
  • 最小特权
  • 权限分离
  • 保持简单
  • 保护隐私
  • 隐藏信息书困难的
  • 不轻信
  • 使用社区资源

2、通用安全设计原则介绍

  • 减少攻击面原则
  • 最小授权原则
  • 权限分离原则
  • 纵深防御原则
  • 完全控制原则
  • 默认安全配置原则
  • 开放设计原则
  • 保护最弱一环原则
  • 最少共用机制原则
  • 安全机制心理可接受原则
  • 平衡安全设计原则

三、软件安全功能设计

1、应用安全功能设计

  • 身份认证:一次性口令、动态口令认证,用户名加口令认证,证书认证
  • 授权:限制用户对资源的访问、对未经授权的用户拒绝访问,同意的访问控制机制,设计后天管理控制方案等
  • 输入与输出验证:对所有来源不明的数据进行验证,对用户输入采用多种验证方法(白名单、特殊字符、正确的数据类型、和克里的数据长度等)
  • 配置管理:确保配置存储的安全,应使用最小特权进程和服务账户,确保管理界面的安全,避免调用系统低层资源,应单独分配管理特权。
  • 会话管理:登录后建立新的会话,确保会话数据安全,确保会话数据传输安全,应及时终止会话,应设计合理的会话存货时间,避免跨站请求伪造。
  • 参数操作:避免使用包含敏感词汇的查询参数,加密查询字符串参数,不信任任何HTTP头,确保用户没有绕过检查。
  • 异常管理:使用结构化的异常处理机制,使用通用错误信息
  • 审核与日志检查。

2、基于安全模式的软件安全设计

安全模式展示:

安全模式名称目的关注点
认证器验证试图访问系统的主题是否是其所声称的身份用户或系统鉴别
基于角色的访问控制描述如何基于人的任务分配功能与权限访问控制
安全的“模型-试图-控制器”利用配置了MVC模式的系统,为用户之间的交互增加交互安全系统交互
传输层安全虚拟专用网应用隧道与加密技术建立安全通道,每个端点都需要鉴别与访问控制安全通信
安全日志与审计对用户行为进行记录,并对该日志进行分析审计

基于安全模式的设计方法:
1)风险确定阶段:
该阶段主要有两个工作,识别风险与评估风险。通过对业务需求、用户需求及安全需求等的分析,利用历史威胁记录及经验没最终实现系统都是安全架构。
2)系统安全架构阶段:
该阶段对风险进行消解,并对解决方案进行评估。在此基础上构建系统的高层架构图。主要工作包括浏览模式库、选择安全模式、评估安全模式和建立系统高层架构。
3)系统设计细化阶段:
该阶段的主要工作包括构架业务类图、实例化安全模式,以及整合系统并适当重构。

四、威胁建模

1、威胁建模的概念

1)什么是威胁建模
通过抽象的概念模型对影响软件系统的威胁进行系统的评估与认识。
2)为什么要威胁建模

  • 在早期发现安全风险
  • 理解安全需求
  • 设计和交付更安全的产品
  • 解决其他技术无法解决的问题

2、威胁建模的流程

1)确立安全目标
确立安全目标包括确立软件系统设计的资产,以及围绕这些资产的业务目标和安全目标。
2)创建应用程序概况图
主要目的是分析应用程序的功能、体系结构、物理部署配置以及构成解决方案的技术 。
3)分解应用程序
主要目的是通过分解应用程序的结构来确认信任边界、数据流、数据入口点和数据出口点。
4)确定威胁
确定肯影响到应用程序和危及安全目标的威胁的最大难题是系统性和全面性,特别是对于一些不断变化的技术和发展中的攻击技术,没有一种方法能够识别复杂软件产品中的所有威胁。所以,在这一个步骤中,需要执行的是确定常见威胁,以及深入的分析其他可能威胁。
5)威胁评估
常见的评估方法由Delphi排序、平均排序、以及概率*影响因子排序
6)确定威胁缓解计划或策略
常见威胁的缓解措施:

威胁缓解措施
假冒验证主体:windows身份认证、Kerberos身份验证、PKI系统、IPsec、数字签名等
篡改数字签名、消息认证、完整性控制等
否认强身份验证、安全日志审计、数字签名、时间戳等
信息泄露加密、访问控制
拒绝服务访问列表控制、授权、高可用性设计
权限提升访问列表控制、权限、输入验证等

7)验证威胁
验证的内容包括威胁模型、列举的缓解措施等。其目的是说明列举出威胁如何进行攻击、攻击的内容和以及缓解措施。
8)威胁建档
威胁建档可以迭代使用,需要在整个生命周期中对威胁模型中已经识别的威胁实施适当的控制。威胁建模也需要更新。

{************************************************************** 浅谈软件安全设计(一) code by 黑夜彩虹 & vxin with almost pure delphi 网站:http://soft.eastrise.net 2007-03-07 --- 转载时请保留作者信息。 **************************************************************} 此CM的设计模式: 1、插入一些花指令 2、写了一些代码迷惑Cracker 3、有简单的Anti_DEDE 和检测调试器 话不多说,请看以下代码: unit main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,strutils; Const C1= 17856; C2= 23589; type TForm1 = class(TForm) Image1: TImage; Edit1: TEdit; Label1: TLabel; Label2: TLabel; Edit2: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} Procedure Anti_DeDe();//检测DEDE反编译器 var DeDeHandle:THandle; i:integer; begin DeDeHandle:=FindWindow(nil,chr($64)+chr($65)+chr($64)+chr($65)); if DeDeHandle0 then begin For i:=1 to 4500 do SendMessage(DeDeHandle,WM_CLOSE,0,0); end; end; Function ABC42():Boolean; //检测调试器; var YInt,NInt:Integer; begin asm mov eax,fs:[30h] movzx eax,byte ptr[eax+2h] or al,al jz @No jnz @Yes @No: mov NInt,1 @Yes: Mov YInt,1 end; if YInt=1 then Result:=True; if NInt=1 then Result:=False; end; function EncryptModule(SourceStr:String;Key:Word;N:Integer):String; var //加密函数 I:Integer; begin SetLength(Result,Length(SourceStr));//利用SetLength函数指定密文长度 //对每一个索引元素进行变换 for I:=1 to Length(SourceStr) do begin Result[I]:=Char(byte(SourceStr[I]) xor (Key Shr N)); Key:= (byte(Result[I]) + Key)*C1+C2; end; end; //==========以下是549的函数,据说没有暴破点,顺便试一试 //========函数作用:动态改变程序运行罗辑 function GetEIP: Integer;//自动生成address的方法 asm mov eax, [esp]; sub eax, 5; //call GetEIP占用5字节 end; function PatchOneItem(PatchItem: String): Boolean; var PatchAddress: Integer; PatchLength: DWord; PatchData: Pointer; PatchDataStr: String; i: Integer; PatchByte: Byte; PID, PHandle: THandle; WriteCount: DWord; begin Result := False; if Length(PatchItem) < 11 then Exit; PatchAddress := StrToInt(\'0x\' + LeftStr(PatchItem, 8)); for i := 1 to Length(PatchItem) do begin if PatchItem[i] \' \' then PatchDataStr := PatchDataStr + PatchItem[i]; end; PatchLength := (Length(PatchDataStr) - 9) div 2; GetMem(PatchData, PatchLength); try for i := 0 to PatchLength - 1 do begin PatchByte := StrToInt(\'0x\'+PatchDataStr[10 + i * 2] + PatchDataStr[10 + i * 2 + 1]); Byte(Pointer(Integer(PatchData) + i)^) := PatchByte; end; GetWindowThreadProcessId(Application.Handle, PID); PHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID); WriteProcessMemory(PHandle, Pointer(PatchAddress), PatchData, PatchLength, WriteCount); CloseHandle(PHandle); finally FreeMem(PatchData, PatchLength); end; Result := PatchLength = WriteCount; end; procedure Patch(PatchFile: String); var PatchItems: TStrings; PatchIndex: Integer; begin if not FileExists(PatchFile) then Exit; PatchItems := TStringList.Create; try PatchItems.LoadFromFile(PatchFile); for PatchIndex := 0 to PatchItems.Count - 1 do begin PatchOneItem(PatchItems[PatchIndex]); end; finally PatchItems.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Anti_DeDe; //检测DEDE,检测到关闭它。 if ABC42 then ExitProcess(0); //检测调试器,终止。 end; procedure TForm1.Button1Click(Sender: TObject); //注册按纽,开始检测 begin //========在这里插入一些花指令 asm jz @Start jnz @Start db 0E8h, 24h, 0, 0 ; db 0, 8Bh, 44h, 24h db 4, 8Bh, 0, 3Dh db 4, 0, 0, 80h db 75h, 8, 8Bh, 64h db 24h, 8, 0EBh, 4 db 58h, 0EBh, 0Ch, 0E9h db 64h, 8Fh, 5, 0 db 0, 0, 0, 74h db 0F3h, 75h, 0F1h, 0EBh db 24h, 64h, 0FFh, 35h db 0, 0, 0, 0 db 0EBh, 12h, 0FFh, 9Ch db 74h, 3, 75h, 1 db 0E9h, 81h, 0Ch, 24h db 0, 1, 0, 0 db 9Dh, 90h, 0EBh, 0F4h db 64h, 89h, 25h, 0 db 0, 0, 0, 0EBh db 0E6h db 0EBh, 1, 0Fh, 31h ; db 0F0h, 0EBh, 0Ch, 33h db 0C8h, 0EBh, 3, 0EBh db 9, 0Fh, 59h, 74h db 5, 75h, 0F8h, 51h db 0EBh, 0F1h db 0B9h, 4, 0, 0 ; @Start: end; if length(edit2.Text)>3 then //比较大于3位 begin //============再写一些骗Cracker if edit2.Text=EncryptModule(Edit1.Text,12345,10) then begin showmessage(\'请重启本软件。\'); //=======还可以再写一些记号,这里我就不写了 end; PatchOneItem(edit2.Text); //真正的比较 showmessage(\'ok\'); //弹出OK对话框 end; end; end.  //====附件为CM,会破解的兄弟可以试试其强度....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值