コード例 #1
0
 public TaintedSourceInfo(ulong id, MethodUniqueSignature method, ImmutableStack <string> callStack)
 {
     Id                = id;
     Method            = method;
     ForwardCallStack  = callStack.Pop();
     BackwardCallStack = ImmutableStack <string> .Empty.Push(callStack.Peek());
 }
コード例 #2
0
 public TaintedSourceInfo(ulong id, MethodUniqueSignature method,
                          ImmutableStack <string> forwardCallStack, ImmutableStack <string> backwardCallStack)
 {
     Id                = id;
     Method            = method;
     ForwardCallStack  = forwardCallStack;
     BackwardCallStack = backwardCallStack;
 }
コード例 #3
0
        private ICallGraphNode CreateCallGraphNode(string name)
        {
            var info = CallInfo.CreateFake(
                new AssemblyInfo(UTF8String.Empty, AssemblyInfo.EmptyVersion),
                MethodUniqueSignature.Create(name));

            return(new CallInfoNode(info));
        }
コード例 #4
0
 public MethodCall(MethodUniqueSignature signature, MethodDef methodDefinition,
                   SymbolicSlot[] parameters, CallKind callKind)
 {
     Signature  = signature;
     Definition = methodDefinition;
     Parameters = parameters;
     CallKind   = callKind;
 }
コード例 #5
0
        private CallGraphNode CreateCallGraphNode(string name)
        {
            var info = new CallInfo(
                new AssemblyInfo(UTF8String.Empty, AssemblyInfo.EmptyVersion),
                MethodUniqueSignature.Create(name),
                OpCodes.Call,
                true,
                new List <MethodUniqueSignature>(0));

            return(new CallGraphNode(info));
        }
コード例 #6
0
        public void MethodUniqueNameGenericTest()
        {
            var name = MethodUniqueSignature.Create(
                "YamlDotNet.Serialization.BuilderSkeleton`1<YamlDotNet.Serialization.DeserializerBuilder>::.ctor()");

            Assert.That(name.ToString(), Is.EqualTo("YamlDotNet.Serialization.BuilderSkeleton::.ctor()"));

            var name2 = MethodUniqueSignature.Create("System.Collections.Generic.IDictionary`2<System.String,System.Object> YamlDotNet.Serialization.Deserializer::Deserialize<System.Collections.Generic.IDictionary`2<System.String,System.Object>>(System.String)");

            Assert.That(name2.ToString(), Is.EqualTo("System.Collections.Generic.IDictionary YamlDotNet.Serialization.Deserializer::Deserialize(System.String)"));
        }
コード例 #7
0
        protected DataFlowAnalysisResult Execute(MethodDef method,
                                                 MethodUniqueSignature taintedSignature = null)
        {
            engine = new SymbolicEngine(index, taintedSignature, 20, true, InputTaintedMode);

            var result = engine.ExecuteForward(method);

            result?.Summary.Dump(@"C:\tmp\experiments\tests", method.Name);
            result.Stat.DumpConsole();
            Console.WriteLine($"All method calls/instructions: {result.Summary.MethodCallCount:N0} / {result.Summary.InstructionCount:N0}");
            return(result);
        }
コード例 #8
0
 public SymbolicEngine(IndexDb indexDb,
                       MethodUniqueSignature taintedCall,
                       uint virtualCallsLimit,
                       bool enableStaticFields,
                       bool inputTaintedMode)
 {
     this.indexDb                  = indexDb;
     this.taintedCall              = taintedCall;
     this.virtualCallsLimit        = virtualCallsLimit;
     this.enableStaticFields       = enableStaticFields;
     this.inputTaintedMode         = inputTaintedMode;
     firstExecutionContextCreating = inputTaintedMode;
 }
コード例 #9
0
        public ExecutionContext(ImmutableStack <string> callStack, MethodUniqueSignature signature, MethodDef method,
                                bool enableStaticFields, bool markInputArguments)
        {
            this.method             = method;
            this.enableStaticFields = enableStaticFields;
            CallStack = callStack;
            Signature = signature;

            staticEntity = new SymbolicReference();
            Static       = new SymbolicSlot(staticEntity);

            var countArguments = method.GetParameterCount();

            Arguments        = new ArgumentContext(signature, countArguments, markInputArguments);
            InstructionCount = method.HasBody ? (double)method.Body.Instructions.Count : 0;
        }
コード例 #10
0
        public ArgumentContext(MethodUniqueSignature signature, int count, bool markInput)
        {
            this.count = count;
            root       = new SymbolicReference();
            slots      = new SymbolicSlot[count];
            for (int id = 0; id < count; id++)
            {
                var entity = new SymbolicReference(new ArgumentSource(id, signature));
                if (markInput)
                {
                    entity.MarkInput();
                }

                root.StoreField(SymbolicReference.ArgumentPrefix + id, entity);
                slots[id] = new SymbolicSlot(entity);
            }
        }
コード例 #11
0
ファイル: Summary.cs プロジェクト: yuske/SerialDetector
        public Summary(MethodUniqueSignature signature,
                       SymbolicReference staticContext,
                       SymbolicReference[] arguments,
                       SymbolicReference returnValue,
                       double methodCallCount,
                       double instructionCount)
        {
            Signature        = signature;
            Static           = staticContext;
            Arguments        = arguments;
            ReturnValue      = returnValue;
            MethodCallCount  = methodCallCount;
            InstructionCount = instructionCount;

            //if (method.FullName.Contains("System.Text.StringBuilder::.ctor(System.Int32,System.Int32,System.Text.StringBuilder)"))
            //if (method.FullName.Contains("UnsafeStringCopy"))
            //if (method.FullName.Contains("Return"))
            {
//                Dump();
            }
        }
コード例 #12
0
        //[Ignore("for debugging only, change type and methodName vars for your case")]
        public void SingleCase()
        {
            var type       = typeof(KnowledgeBase.Cases.XslCompiledTransformPatterns);
            var methodName = nameof(KnowledgeBase.Cases.XslCompiledTransformPatterns.XsltLoadWithPayload);

            var context = Context.CreateToAnalyze();
            var method  = type.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance);
            var errors  = Loader.ExecuteCase(context, type, new[] { method });

            //var patternGroup = Loader.GetPatternGroup(type, methodName);

            Assert.That(errors, Is.Empty);
            Assert.That(context.Patterns.Count, Is.GreaterThan(0));

            var builder = new CallGraphBuilder(index);
            var graph   = builder.CreateGraph(context.Patterns);

            Assert.That(graph.EntryNodes.Count, Is.GreaterThan(0));
            Assert.That(graph.EntryNodes.Keys
                        .Contains(MethodUniqueSignature.Create($"{type.FullName}::{methodName}()")));
        }
コード例 #13
0
ファイル: SymbolicSlot.cs プロジェクト: yuske/SerialDetector
        public void AddPossibleInputTransformMethod(MethodUniqueSignature method, IEnumerable <string> callStack,
                                                    List <SymbolicSlot> outputSlots)
        {
            return;

            MaterializeFields();
            for (int i = 0; i < outputSlots.Count; i++)
            {
                var outputSlot = outputSlots[i];
                if (outputSlot == this)
                {
                    continue;
                }

                outputSlot.MaterializeFields();
                for (int j = 0; j < entities.Length; j++)
                {
                    var entity = entities[j];
                    entity.AddPossibleInputTransformMethod(method, callStack, outputSlot.entities);
                }
            }
        }
コード例 #14
0
ファイル: SymbolicSlot.cs プロジェクト: yuske/SerialDetector
        public void AddTargetMethod(MethodUniqueSignature method, ImmutableStack <string> callStack,
                                    DataFlowAnalysisResult result)
        {
            if (IsConstAfterSimplification())
            {
                return;
            }

            MaterializeFields(assert: false);
            if (IsConstAfterSimplification())
            {
                return;
            }

            for (int i = 0; i < entities.Length; i++)
            {
                var entity = entities[i];
                if (!entity.IsConst)
                {
                    entity.AddTargetMethod(method, callStack, result);
                }
            }
        }
コード例 #15
0
        public void AllCases()
        {
            foreach (var type in Loader.GetCaseTypes())
            {
                Console.WriteLine($"{type}:");
                foreach (var method in Loader.GetCaseMethods(type))
                {
                    Console.WriteLine($"    {method}");

                    var context = Context.CreateToAnalyze();
                    var errors  = Loader.ExecuteCase(context, type, new[] { method });

                    Assert.That(errors, Is.Empty);
                    Assert.That(context.Patterns.Count, Is.GreaterThan(0));

                    var builder = new CallGraphBuilder(index);
                    var graph   = builder.CreateGraph(context.Patterns);

                    Assert.That(graph.EntryNodes.Count, Is.GreaterThan(0));
                    Assert.That(graph.EntryNodes.Keys
                                .Contains(MethodUniqueSignature.Create($"{type.FullName}::{method.Name}()")));
                }
            }
        }
コード例 #16
0
 public bool IsValid(MethodUniqueSignature signature) =>
 //whiteList.Contains(signature);
 !blackList.Contains(signature);
コード例 #17
0
 public SimpleNode(MethodUniqueSignature signature)
 {
     MethodSignature = signature;
 }
コード例 #18
0
 public ArgumentSource(int index, MethodUniqueSignature signature)
 {
     this.signature = signature;
     Index          = index;
 }
コード例 #19
0
 public TaintedSourceInfo(ulong id, MethodUniqueSignature method,
                          ImmutableStack <string> forwardCallStack, ImmutableStack <string> backwardCallStack,
                          ImmutableStack <(MethodUniqueSignature, ImmutableStack <string>)> attackTriggerCalls)