惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
A
Arctic Wolf
Security Latest
Security Latest
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
Latest news
Latest news
Help Net Security
Help Net Security
S
Security Affairs
Webroot Blog
Webroot Blog
The Hacker News
The Hacker News
AI
AI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tor Project blog
Forbes - Security
Forbes - Security
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
H
Help Net Security
L
Lohrmann on Cybersecurity
S
SegmentFault 最新的问题
Google Online Security Blog
Google Online Security Blog
MongoDB | Blog
MongoDB | Blog
Cyberwarzone
Cyberwarzone
The Last Watchdog
The Last Watchdog
S
Securelist
N
News and Events Feed by Topic
S
Secure Thoughts
F
Fortinet All Blogs
博客园_首页
C
Cybersecurity and Infrastructure Security Agency CISA
量子位
M
MIT News - Artificial intelligence
F
Full Disclosure
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
P
Privacy International News Feed
L
LangChain Blog
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes

博客园 - 水如烟(LzmTW)

HOW TO:获取硬盘物理序列号(VB.NET) 一个创建快捷方式类 一个简单的CodeAccessPermission生成器 认识一下Attribute HOW TO:端口打印(比较粗糙) 标记法定义和创建数据库(四) 标记法定义和创建数据库 Sql2005数据类型与Framework类型的对应关系 HOW TO:重启程序(WinForm) HOW TO:设置默认打印机 HOW TO:避免“将COM对象与其基础RCW分开后不能再使用该对象”错误 HOW TO:控制是否允许用户退出ExcelApplication的Workbook 树和自联表(五) 树和自联表(六) 树和自联表(四) 树和自联表(一) 行政区划数据数据库的设计(脚本) 行政区划数据数据库的设计(七) 行政区划数据数据库的设计(六)
.NET的变量在代码集中是不安全的
水如烟(LzmTW) · 2007-11-20 · via 博客园 - 水如烟(LzmTW)

Author:水如烟

.NET的安全性问题是一个综合性的问题,这不是我现在能学习好理解透的,我估计也不是一般的.NET的编码者能够把握住应用好的。

至少,在代码集中,.NET的全局变量,或者说受Private修饰保护的对象,是不安全的。

在现实中有一个传话游戏,其要义是,信息在信息链的传递过程中会失真。.NET也一样,很难保证一个关键的信息在传递的过程中保持“纯洁”而不被潜伏中的攻击而受污染。特别是在大规模的代码集中。

SecureString类
在.NET的设计中,SecureString类应该是安全系数比较高的。它有两个作用,一是赋值后MakeReadOnly以便在后续的传递中不致修改,二是在必要的时候进行销毁。但是用它来传递关键信息,比如密码,还是不安全的。这个类里头有一个m_readOnly As Boolean的Private变量来保存当前实例可否修改的状态,你可以重置该值为False,便可以对它重新修改,MakeReadOnly也就失去了它本身的作用。

ReadOnlyCollection类
它的本义是不能对当前实例的项目进行增删。在它的设计中,用一个list的Private变量来存储当前集合。事实并不能保证它的作用。你甚至可以用自己的list替换了它。

测试代码

Imports System.Runtime.InteropServices
Imports System.Collections.ObjectModelPublic Class NoSecurePublic Sub TestSecureString()
        
Dim t As New Security.SecureString
        t.AppendChar(
"A"c)
        t.AppendChar(
"B"c)
        t.MakeReadOnly()

        Console.WriteLine(Marshal.PtrToStringAuto(Marshal.SecureStringToBSTR(t)))

Dim h As New LzmTW.uSystem.uReflection.TypeHelper(t)
        h.SetMemberValue(
"m_readOnly"False)

        t.AppendChar(

"C"c)

        Console.WriteLine(Marshal.PtrToStringAuto(Marshal.SecureStringToBSTR(t)))

End SubPublic Sub TestReadonlyCollection()Dim t As New ReadOnlyCollection(Of String)(New String() {"A""B""C"})
        
For i As Integer = 0 To t.Count - 1
            Console.Write(t.Item(i))
        
Next

        Console.WriteLine()

Dim h As New LzmTW.uSystem.uReflection.TypeHelper(t)
        
Dim mNowList As New List(Of String)
        mNowList.AddRange(
New String() {"A""B""C""D"})
        h.SetMemberValue(
"list", mNowList)For i As Integer = 0 To t.Count - 1
            Console.Write(t.Item(i))
        
NextEnd SubEnd Class


上面用到的 TypeHelp类:

TypeHelper.Methods.vb

Imports System.ReflectionNamespace LzmTW.uSystem.uReflection

    Partial 

Class TypeHelperPublic Sub SetCurrentObj(ByVal obj As Object)
            
If Not obj Is Nothing AndAlso Not Me.CurrentType.IsInstanceOfType(obj) Then
                
Throw New ArgumentException("实例类型与内部类型不相符")
            
End IfMe.gCurrentObjct = obj
        
End SubPublic Function GetMemberValue(ByVal name As StringByVal ParamArray args() As ObjectAs Object
            
Return Me.CurrentType.InvokeMember( _
                name, _
                MemberGetBinding, _
                
Nothing, _
                
Me.CurrentObject, _
                args)
        
End FunctionPublic Sub SetMemberValue(ByVal name As StringByVal ParamArray args() As Object)
            
Me.CurrentType.InvokeMember( _
                name, _
                MemberSetBinding, _
                
Nothing, _
                
Me.CurrentObject, _
                args)
        
End SubPublic Function MethodInvoke(ByVal name As StringByVal ParamArray args() As ObjectAs Object
            
Return Me.CurrentType.InvokeMember( _
                name, _
                MethodBinding, _
                
Nothing, _
                
Me.CurrentObject, _
                args)
        
End FunctionPublic Function NewInstance(ByVal ParamArray args() As ObjectAs Object
            
Dim mParaCount As Integer = args.Length
            
Dim mCtors As ConstructorInfo() = Me.CurrentType.GetConstructors(MethodBinding)For Each ctro As ConstructorInfo In mCtors
                
If ctro.GetParameters.Length = mParaCount Then
                    
Return ctro.Invoke(args)
                
End If
            
NextReturn Nothing
        
End Function''' <summary>
        ''' 可以使用*?[abc][!abc],忽略大小写
        ''' </summary>
        Public Function FindMember(ByVal name As StringAs MemberInfo()
            
If String.IsNullOrEmpty(name) OrElse name = "*" Then
                
Return Me.CurrentType.GetMembers(Binding)
            
End IfDim mPattern As String = "*[*?]*"
            
If Not name Like mPattern Then Return Me.CurrentType.GetMember(name, Binding)Dim mArray As New List(Of MemberInfo)
            
For Each m As MemberInfo In Me.CurrentType.GetMembers(Binding)
                
If m.Name.ToLower Like name.ToLower Then
                    mArray.Add(m)
                
End If
            
NextReturn mArray.ToArray
        
End FunctionPrivate MemberGetBinding As BindingFlags = _
                BindingFlags.Instance 
Or _
                BindingFlags.Public 
Or _
                BindingFlags.NonPublic 
Or _
                BindingFlags.Static 
Or _
                BindingFlags.GetField 
Or _
                BindingFlags.GetProperty 
Or _
                BindingFlags.IgnoreCase
Private MemberSetBinding As BindingFlags = _
                BindingFlags.Instance 
Or _
                BindingFlags.Public 
Or _
                BindingFlags.NonPublic 
Or _
                BindingFlags.Static 
Or _
                BindingFlags.SetField 
Or _
                BindingFlags.SetProperty 
Or _
                BindingFlags.IgnoreCase
Private MethodBinding As BindingFlags = _
                BindingFlags.Instance 
Or _
                BindingFlags.Public 
Or _
                BindingFlags.NonPublic 
Or _
                BindingFlags.Static 
Or _
                BindingFlags.InvokeMethod 
Or _
                BindingFlags.IgnoreCase
    
End ClassEnd Namespace

TypeHelper.vb

Imports System.ReflectionNamespace LzmTW.uSystem.uReflectionPublic Class TypeHelperPrivate gType As Type
        
Private gCurrentObjct As ObjectPublic ReadOnly Property CurrentType() As Type
            
Get
                
Return gType
            
End Get
        
End PropertyPublic ReadOnly Property CurrentObject() As Object
            
Get
                
Return gCurrentObjct
            
End Get
        
End PropertySub New(ByVal referrenceObj As Object)
            
If Me.IsType(referrenceObj) ThenMe.gType = CType(referrenceObj, Type)
            
ElseMe.gType = referrenceObj.GetType
                
Me.gCurrentObjct = referrenceObj
            
End If
        
End SubSub New(ByVal assembly As AssemblyByVal fullTypeName As String)
            
Me.InternalCreate(assembly, fullTypeName)Me.InternalCheckIsValid(fullTypeName, True)
        
End SubSub New(ByVal referrenceType As Type, ByVal typeName As StringOptional ByVal isNestedType As Boolean = False)Dim mAssembly As Assembly = referrenceType.AssemblyMe.InternalCreate(mAssembly, typeName)If Me.InternalCheckIsValid(typeNameFalseThen ReturnDim mFullTypeName As String = GetFullTypeName(referrenceType, typeName, isNestedType)Me.InternalCreate(mAssembly, mFullTypeName)Me.InternalCheckIsValid(mFullTypeName, True)
        
End SubPrivate Sub InternalCreate(ByVal ass As AssemblyByVal fulltypename As String)
            gType 
= ass.GetType(fulltypename, FalseTrue)
        
End SubPrivate Function InternalCheckIsValid(ByVal typename As StringByVal throwOnError As BooleanAs Boolean
            
If gType Is Nothing Then
                
If throwOnError Then
                    
Throw New ArgumentException(String.Format("typeName: {0} 不存在"typename))
                
Else
                    
Return False
                
End If
            
End IfReturn True
        
End FunctionPrivate Function GetFullTypeName(ByVal referrenceType As Type, ByVal typeName As StringByVal isNestedType As BooleanAs String
            
Dim mFullName As String = NothingDim mRefFullName As String = referrenceType.FullNameIf isNestedType Then

                mFullName 

= String.Concat(mRefFullName, "+"typeName)
            
ElseDim mLastIndex As Integer = mRefFullName.LastIndexOf(referrenceType.Name)

                mFullName 

= String.Concat(mRefFullName.Substring(0, mLastIndex), typeName)
            
End IfReturn mFullName
        
End FunctionPrivate Function IsType(ByVal instance As ObjectAs Boolean
            
Return instance.GetType.IsSubclassOf(GetType(Type))
        
End FunctionPublic Const Binding As BindingFlags = _
            BindingFlags.Instance 
Or _
            BindingFlags.Public 
Or _
            BindingFlags.NonPublic 
Or _
            BindingFlags.Static 
Or _
            BindingFlags.CreateInstance 
Or _
            BindingFlags.IgnoreCase
End ClassEnd Namespace