Windows安全性编程完整版_第1页
Windows安全性编程完整版_第2页
Windows安全性编程完整版_第3页
Windows安全性编程完整版_第4页
Windows安全性编程完整版_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Windows安全性编程Windows安全性编程Windows安全性编程的范畴如何修改/创建一个安全属性符合你预期的对象CreateEvent的参数LPSECURITY_ATTRIBUTES如将一个C盘目录下的配置文件,改为所有人可访问EQ\*jc2\*hps60\o\ad(\s\up10(–),作)EQ\*jc2\*hps40\o\ad(\s\up10(SACL和DACL是什么?),为一个用户,你如)何在代码里查看或修改自己的特权(privilege);EQ\*jc2\*hps40\o\ad(\s\up10(–或者以其他用户的特权/profile执行代码),进程间通信问题:如何“绕过”)安全边界(session,desktop,winstat,uac,process),进行通信/弹窗/访问等Content•1.Windows安全性编程的范畴•2.Windows安全模型•3.Windows访问控制和权限管理•4.WinVista/7安全性增强•5.Win8安全性增强(?)•6.总结2.Windows安全模型•2.1角色–Principal–管理机构Principal1Principal1Object1Principal2Object2Access–认证•2.2环境•2.3执行2.1 - 2.1 - .1PrincipalConcept•Principal,译作主体/用户实体–是一个安全的概念,指的是安全事务中的各个参与者–它是相对于对象(Object)而言的,对象是一种资源,主体可以操作资源–主体可以是:用户/计算机/服务–有一个人类可识别的名字(Account)和机器可处理的标识符(SID)来标识–主体的信息存储在安全数据库(Securitydatabase)中,如AD、SAM–主体为了表明自己的身份,需要证书(Credential),如口令Access2.1.1PrincipalSIDGUID/UUID:全球唯一标识符,一个在空间和时间上保证了唯一性的128位的定长标识空间:一个IEEE802地址,有中央管理机构颁发时间:根据时钟调整之后永久递增的一个数字SID:SecurityIdentify,安全标识符,不定长的空间:在Windows安装时产生的96位标识(储存在注册表中)时间:生成一个永久递增的计数值,与上述标识结合管理机构标识符:标识账号颁发机构SID格式:S-R-I-SA-SA-SA...S:固定字母SR:revision,当前为1I:48位管理机构标识SA:32位子管理机构.1PrincipalSIDSample:Everyone:S-1-1-0Administrator:S-1-5-21-XXXX-XXXX-XXXX-500Guest :S-1-5-21-XXXX-XXXX-XXXX-50121-XXXX-XXXX-XXXX:标识21之后跟的是安装时分配的机器ID在不同语言中,上述三个例子的pricipal名称可能不一样,最好编码组合SID来应用principal使用LookupAccountSid和LookupAccountName这两个函数可以进行Account和SID之间的互相映射(psgetsid.exe)2.1 2.1 .1Principal-CredentialCredential:证书,以安全的方式来识别一个Principal,防止假冒一个Principal能够提供的有效Credential,可概括以下三个问题:你有什么?Key你知道什么?Password–你是谁(什么)?•fingerprint.2管理机构需求:Alice想在多台机器上登录,每台机器都需要“记住”她的Credentials,导致实施很难、安全性降低方案:可信的中间管理机构(authority)-所有用户的Credentials都存在一个可信服务器上用户实体名变为:principal@authoritySID变为:S-1-5-21-XXXX-XXXX-XXXX-XXXX-N,N为32位的管理机构标识管理机构的单点失效隐患:集中式的管理的普遍问题需要多个备份的可信服务器需要一种可靠的同步复制机制1.3机器/服务既主体在WindowsNT4.0以前机器不是第一级Principal虽然机器可以向管理机构证明身份,不能像其他用户实体证明身份不能实现mutualauthenticationWindows2000下,计算机账号和用户账号时同等的一般情况下,计算机账号为计算机名后面加一个$peterpc-peterpc$可以使用newsid.exe来改变虚拟机的sid 1.4认证(Authentication)-Concept认证是一个用户实体向另一个用户实体证明身份的过程单向认证:Alice向Server证明了自己的身份双向认证(MutualAuthentication):Alice向Bob证明了自己的身份,同时也要求Bob证明他的身份建立安全通道:Trent(管理机构)向Alice和Bob提供会话密钥,以加密二者的通信域:提供Crendential的中央存储机构(Trent)DC是域的具体实现在winnt4.0没有提供目录服务,区分PDC、BDC,所有修改必须在PDC上进行windows2000后提供了目录服务,不区分PDC、BDC组织单元:比域小一点的安全边界1.4认证(Authentication)-LSALSA:LocalSecurityAuthority,本地安全管理机构,它是一个子系统,提供认证服务独立的机器有自己LSA和私有的安全数据库小局域网(LAN),可在每台机器上同步其他机器的账号口令–Mac1\Alice和Mac2\Alice拥有相同的账号和口令,虽然SID不同,但Mac1和Mac2的LSA会将二者认为相同大局域网,需要将一台机器升级为DC,该机器的LSA存储全域域账号的Credentials,将安全数据库放进目录服务小结•角色的定义/SID/Credential/管理机构/LSA•请判断以下几个角色的区别:–Alice 用户 最小权限最大安全的原则Q:如何在指定自己的服EQ\*jc2\*hps48\o\ad(\s\up10(–AlicePC$),–LocalSer)vice EQ\*jc2\*hps48\o\ad(\s\up10(计算机),拥有访)问权限最EQ\*jc2\*hps36\o\ad(\s\up10(务以哪个帐号运行?),小的本地预设用)户–NetworkService拥有访问网络资源权限的本地预设用户–LocalSystem 拥有本机所有权限的本地预设用户–TrustedInstaller:WindowsModulesInstaller 服务•内核态有没有用户的概念?2.Windows安全模型•2.1角色•2.2环境–LogonSession–Token–WindowStation–Desktop–Process•2.3执行环境:一段代码的安全上下文HANDLEhFile=::CreateFile(“%programfile%\baiduIS\config.ini”, GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,SessionWindowsStationSessionWindowsStationDesktopProcessThreadCodeif(INVALID_HANDLE_VALUE!=hFile){ MessageBox(NULL,"Suc",L"",MB_YESNO);}else{ MessageBox(NULL,“Failed",L"", MB_YESNO);}它会按照你的意思前进吗?上述代码有几种执行结果?2.2 2.2 2.2 .1LogonSession登录会话:一个用户登录到一台机器上的表征登录会话是用户在这台机器上操作的基石,是进程的运行环境;LogonID:64位的唯一标识•登录会话将缓存Principal的Credential登录会话的类型:–systemlogonsession–interactivelogonsession–networklogonsession–servicelogonsession–batchlogonsessionlogonsessions.exe查看当前登录会话.2TokenLSA不仅只生成logonsession,还生成token。token是一种中间层,为了支持多进程、不同安全策略,它允许在同一个登录会话下,修改token,实现不同的安全环境,并且不影响其他进程。CreateEvent函数(进程、线程、段、信号量),需要传入token。登录会话的传播,使得每个安全边界都有自己的tokenAlice的交互式登录会话RelaxedAPP.exeparanoidAPP.exe令牌1默认DACL...每个人...令牌2默认DACL...仅Alice....3窗口工作站WindowStation是一个安全的可执行对象:1)安全边界:Q:Alice和Devil同时登录机器,Alice打开了explorer...,Devil采用PostMessage向explorer发送详细,欲删除文件importantfile.dat,会发生什么情况?A:由于WindowStation的存在,Devil不能跨Station发送消息。2)资源:内嵌一个完整的用户环境(UserEnvironment)剪切板原子表桌面(窗口资源的虚拟内存)3)WinSta0是唯一的一个实际绑定到硬件上的windowstation.4)窗口句柄是工作站相关的,不是机器相关的。应避免将窗口消息作为进程间通信。.3窗口工作站AlicesmachineAlicesmachinelsass.exerpcss.exeservices.exesvc1.execsrss.exewinlogon.exesvc2.exeSystem登录会话MikeComSvr.exe批登录会话Alicesvc3.exe服务登录会话Bob网络登录会话Joe网络登录会话AliceExplorer.exenotepad.exe交互式登录会话stationsessionwinsta0winsta0.4桌面桌面对象:有一个逻辑界面,并包含用户接口对象(例如:窗口,菜单,钩子),它可以被用来创建和管理窗口,隶属于当前的线程所在的窗口站.安全边界:消息只能在同一桌面的进程间发送,钩子过程也只能接受一个桌面上的消息.每个被分配到Winsta0窗口站的桌面对象可以显示用户接口和接受用户输入,但是同一时间只有一个桌面对象是活动的在默认情况下,有3个桌面对象在Winsta0窗口站默认桌面(default)屏幕保护sreen-saver登录窗口(Winlogon)屏幕,保护和登录窗口是保护桌面在非保护桌面活动的情况下,可以使用OpenInputDesktop和SwitchDesktop去取得和切换不同的桌面SysinternalsSuite\Desktops.exe •

2.2.5进程进程是一个资源的集合运行时所在的登录会话(包括令牌,令牌是登录会话与进程的脐带)运行时所在的窗口工作站UserProfile:存储用户实体敏感的环境信息,比如环境变量、registryhive和shell设置进程可通过SetProcessWindowStation连接到某窗口站,不可继承线程是进程的可执行单元可修改令牌可通过SetThreadDesktop将线程连接到一个桌面,可继承不可修改UserProfile可impersonate其他用户小结:一段代码的安全上下文HANDLEHANDLEhFile::=CreateFile“%(programfile%\baiduIS\config.ini”,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(INVALID_HANDLE_VALUE!=hFile)MessageBox(NULL,"Suc",L"",MB_YESNO);MessageBox(NULL,“Failed",L"",MB_YESNO);•需要考虑的因素SessionWindowsStationDesktopProcessThreadCode}else{ }2.Windows安全模型•2.1角色•2.2环境•2.3执行–授权(AuthorizationAttribute)–对象和安全描述符–访问控制策略–选择一个模型2.2.3. .1SD的内存形式由于SD是不定长的,windows提供两种格式Self-relatedSD:containspointerstothesecurityinformation.–absoluteSD:storesallitssecurityinformationinacontiguousmemory.typedefstruct_SECURITY_DESCRIPTOR{UCHARRevision;UCHARSbz1;SECURITY_DESCRIPTOR_CONTROLControl;PSIDOwner;PSIDGroup;PACLSacl;PACLDacl;}SECURITY_DESCRIPTOR,*PISECURITY_DESCRIPTOR;通常情况下,用户自己创建的是absolute,系统返回的是self-related索引SD各部分的APIGet/SetSecurityDescriptorOwner/Group/Dacl/SaclGet/SetSecurityDescriptorControl引用SDtypedefstructHANDLEWINAPICreateMutex( _SECURITY_ATTRIBUTES{__in_optLPSECURITY_ATTRIBUTESlpMutexAttributes, DWORDnLength;LPVOIDlpSecurityDescriptor;__inBOOLbInitialOwner,BOOLbInheritHandle;__in_optLPCTSTRlpName }SECURITY_ATTRIBUTES,);场景1(最常见):传递NULL 采用系统默认的SD(GENERIC_ALL)场景2:传递一个自定义SD 一般情况下,只是自定义DACL,其他的有系统默认填写场景3:改变当前线程的默认SD Step1:创建一个自己的DACL Step2:调用SetTokenInformation改变当前SD Step3:传递NULL内置对象的SD对内置对象SD的操作比较简单,直接对handle/命名操作Set/GetSecurityInfo,Set/GetNamedSecurityInfoDWORDWINAPIGetSecurityInfo(__inHANDLEhandle,__inSE_OBJECT_TYPEObjectType,__inSECURITY_INFORMATIONSecurityInfo,__out_optPSID*ppsidOwner,__out_optPSID*ppsidGroup,__out_optPACL*ppDacl,__out_optPACL*ppSacl,__out_optPSECURITY_DESCRIPTOR*ppSecurityDescriptor);注意:对SACL的读取和修改需要SeSecurityPrivilege特权私有对象的SD对于私有的自定义对象,系统不能无缝地提供管理功能•创建一个自定义SDBOOLWINAPICreatePrivateObjectSecurity(__in_optPSECURITY_DESCRIPTORParentDescriptor,__in_optPSECURITY_DESCRIPTORCreatorDescriptor,__outPSECURITY_DESCRIPTOR*NewDescriptor,__inBOOLIsContainerObject,__in_optHANDLEToken,__inPGENERIC_MAPPINGGenericMapping);返回一个完整的SD,可传入AccessCheck、CreateMutex等注意各个参数的意义 3.3.5SDDefinitionLanguageTheSDdefinitionlanguage(SDDL)definesthestringformatthattheConvertSecurityDescriptorToStringSecurityDescriptorandConvertStringSecurityDescriptorToSecurityDescriptorfunctionsusetodescribeasecuritydescriptorasatextstring.一个stringSD形如O:owner_sidG:group_sidD:dacl_flags(string_ace1)(string_ace2)...(string_acen)S:sacl_flags(string_ace1)(string_ace2)...(string_acen)e.g:"O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)" /en-us/library/aa379567(VS.85).aspx3.Windows访问控制和权限管理•3.1Permission(6.1)•3.2InsideSD(6.2)•3.3SDProgramming(6.3,4,6,7)•3.4InsideACL(6.5)DACL原理DACL检查SACL原理管理SACL•3.5ACLinherit(6.6)•3.6ACLProgramming(6.9)3.4.1DACL原理DACL是安全描述符的心脏,由ACE(AccessControlEntry)组成ACE的组成如下+/-inheritSIDACCESS_MASK-0x00AliceSIDGENERIC_WRITE+0x03FriendsSIDGENERIC_READDACL解析遵循一定规则+表示增加permission,-表示删除permission–直接ACE优先于继承ACE–当+/-冲突时,-生效(处于同一继承级别)–没有定义ACE的permission为-,因此EmptyDACL拒绝所有NULLDACL赋予所有permission3.4.2DACL检查在程序员调用AccessCheck或对象管理器实现访问检查时,需要如下三条信息访问者的授权属性(Token)请求意图(由API本身或其传递进来的参数指定)对象的安全设置(SD)BOOLWINAPIAccessCheck(__inPSECURITY_DESCRIPTORpSecurityDescriptor,__inHANDLEClientToken,__inDWORDDesiredAccess,__inPGENERIC_MAPPINGGenericMapping,__out_optPPRIVILEGE_SETPrivilegeSet,__inoutLPDWORDPrivilegeSetLength,__outLPDWORDGrantedAccess,__outLPBOOLAccessStatus);注意:AccessCheck不会被审计,其原理只是做掩码计算3.4.3SACL原理SACL组成与DACL一样,但+/-意义不同,且ACE没有顺序区别+审计AccessSuccess-审计AccessFailure无不审计TheObjectOpenAuditAlarmfunctiongeneratesauditmessageswhenaclientapplicationattemptstogainaccesstoanobjectortocreateanewone.ObjectCloseAuditAlarmfunctiongeneratesanauditmessageinthesecurityeventlogwhenahandletoaprivateobjectisdeleted.requiresthecallingapplicationtohavetheSeAuditPriviledgeenabled3.4.4管理SACL查看或改变对象的SACL,需要permission:ACCESS_SYSTEM_SECURITY这是一种授权的特殊许可,需要特权SeSecurityPrivilege这是因为SACL不是自主的,拥有者不具备READ_CONTROL和WRITE_DAC改变本线程SACL:HANDLEhThread=OpenThread(ACCESS_SYSTEM_SECURITY,FALSE,GetCurrentThreadId());SetSecurityInfo(hThread,SE_KERNERL_OBJECT,SACL_SECURITY_INFORMATION,0,0,0,g_psacl);3.Windows访问控制和权限管理•1Permission(6.1)•2InsideSD(6.2)•3SDProgramming(6.3,4,6,7)•4InsideACL(6.5)•5ACLinherit(6.6)–继承概述–win2k下的ACL继承机制•6ACLProgramming(6.9)3.5.1继承概述为什么要继承分级对象,权限具有继承性(如文件系统、注册表)继承存在的挑战分级对象,前后两级的对象类型不一样ACL的一致性维护(前面改了,后面要不要改)虽然具有继承特性,ACL是静态,子级ACL会在父级ACL改变时跟着改变因此,做访问检查时,不需要遍历ACL继承链在windowsNT4中继承的一致性问题没有得到很好的解决,Win2K开始,引入了继承阻断机制,更加完善3.5.2win2k下的ACL继承机制ACEACEACEACEACEACEACEACE继承的ACE不能被对象编辑器更改父ACE的信息会在子ACE创建时或父ACE变化时传递给父ACE可以控制继承流是否继续传递(见虚框)SE_DACL_PROTECTEDSE_SACL_PROTECTED继承下的DACL的ACE顺序直接否定的ACE–直接肯定的ACE继承否定的ACE继承肯定的ACE可见访问检查是,直接优先于继承,否定优先于肯定3.Windows访问控制和权限管理•1Permission(6.1)•2InsideSD(6.2)•3ProgrammingSD(6.3,4,6,7)•4InsideACL(6.5)•5ACLinherit(6.6)•6ProgrammingACL(6.9)–内存形式–新建一个ACL/插入ACEACLHeaderACE[1]ACE[2]...ACE[n]3.6.1内存形式typedefstruct_ACL{BYTEAclRevision;BYTESbz1;WORDAclSize;WORDAceCount;WORDSbz2;}ACL,*PACL;typedefstruct_ACE_HEADER{BYTEAceType;BYTEAceFlags;WORDAceSize;}ACE_HEADER,*PACE_HEADER;typedefstruct_ACCESS_ALLOWED_ACE{ACE_HEADERHeader;ACCESS_MASKMask;DWORDSidStart;}ACCESS_ALLOWED_ACE,*PACCESS_ALLOWED_ACE;typedefstruct_ACCESS_DENIED_ACE{ACE_HEADERHeader;ACCESS_MASKMask;DWORDSidStart;}ACCESS_DENIED_ACE,*PACCESS_DENIED_ACE;3.6.2新建一个ACL/插入ACE最重要的是要关注ACE的顺序WindowsAPIAddAccessAllowed/DeniedAceEx只是从最后插入,需要考虑顺序所以一般情况下,是新建一个ACL,将老ACL拷贝过来的同时插入ACE

总结•访问控制模型AA控制Principle的权限ACL表达Object的控制如何修改AA和ACL

Content•1.Windows安全性编程的范畴•2.Windows安全模型•3.Windows访问控制和权限管理•4.WinVista/7安全性增强•5.Win8安全性增强(?)•6.总结4.WinVista/7安全性增强4.1Session0isolationSession0inNt5.xSession0isolationCompatibleisuueSessionWindowsStationDesktopSessionWindowsStationDesktopProcessThreadCodeWindowsIntergrityMechanismUIPIUAC4.1.1session0inNt5.x•在WinXP中,服务进程(LocalSystem)与用户进行交互(winsta0)•这是因为服务和第一个用户进行都放在了session0,共享一个winsta0•安全风险:–servicesrunwithelevatedprivileges–userapplicationsrunwithuserprivileges(mostofwhicharenotadmin).–Thismakestheservicestargetsformaliciousagentsthatarelookingformechanismstoelevatetheirownprivilegelevelsby“hijacking”theservices.4.1.2session0inNt6.x•Session分离–只有服务进程运行在Session0–用户进程被隔离出session0,放在Session1,Session2…–通过Session隔离,降低了服务被用来提权的风险4.1.2compatibleissue•Session隔离–桌面隔离,窗口弹到winlogon桌面上–Session相关权限不一致•解决方法MesssageBox->WTSSendMessageCreateProcessAsUserIPC通信确保跨Session内核对象命名加“Global\*”全局4.2.1WindowsIntegrityMechanismWhy:AAandPermissionarenotenough当一个用户登录系统,他所运行的所有程序具有完全权限(risk)V.S.Linux,rootuserisgrantedfullrightsonlywhennecessaryWhat:Windows安全模型的一个扩展补充限制同一session下某些程序的权限How:通过赋予进程Token一个IntegrityLevelSIDs,以IntegrityLevel来控制Token指定的privilegesMandatoryIntegrityControl:在对象中增加一个mandatorylabelACE来进行访问控制4.2.1WindowsIntegrityMe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论