public static List <IO2Finding> glueClickButtonTraces(String ClickButtonMappingOzasmt, String webLayerOzasmt, String webServicesLayerOzasmt)
        {
            var results = new List <IO2Finding>();

            var clickButton = new O2Assessment(new O2AssessmentLoad_OunceV6(), ClickButtonMappingOzasmt);
            var webLayer    = new O2Assessment(new O2AssessmentLoad_OunceV6(), webLayerOzasmt);
//            var webServices = new O2Assessment(new O2AssessmentLoad_OunceV6(), webServicesLayerOzasmt);

            var webLayerAllTraces = OzasmtUtils.getDictionaryWithO2AllSubTraces(webLayer);
            var count             = webLayerAllTraces.Count;

            foreach (var clickButtonFinding in clickButton.o2Findings)
            {
                var sinkToFind = OzasmtUtils.getKnownSink(clickButtonFinding.o2Traces).signature;
                if (webLayerAllTraces.ContainsKey(sinkToFind))
                {
                    foreach (var webLayerO2Trace in webLayerAllTraces[sinkToFind])
                    {
                        results.Add(OzasmtGlue.createCopyAndGlueTraceSinkWithSource(clickButtonFinding, webLayerO2Trace));
                    }
                }
            }
            DI.log.debug(" {0} findings in result ", results.Count);
            return(results);
        }
        public static void mapFunctionInUrlToAscx(List <IO2Finding> findingsToProcess)
        {
            foreach (var o2Finding in findingsToProcess)
            {
                var source          = OzasmtUtils.getSource(o2Finding.o2Traces);
                var indexOfFunction = source.signature.IndexOf("function=");
                if (indexOfFunction > 0)
                {
                    var functionCalled = source.signature.Substring(indexOfFunction + 9);
                    functionCalled = functionCalled.ToLower();
                    var currentSink = OzasmtUtils.getKnownSink(o2Finding.o2Traces);
                    currentSink.traceType = TraceType.Root_Call;

                    string newSinkSignature = String.Format("ASP.ascx_{0}_ascx_{1}", functionCalled.Replace('\\', '_'),
                                                            currentSink.signature);
                    currentSink.childTraces.Add(new O2Trace(newSinkSignature, TraceType.Known_Sink));
                }
            }
        }
Esempio n. 3
0
        public void CreateFinding_WithTrace()
        {
            string       sFileToCreate    = DI.config.TempFileNameInTempDirectory;
            const uint   line_number      = 2;
            const uint   column_number    = 3;
            const uint   ordinal          = 1;
            const string context          = "TraceContext";
            const string signature        = "TraceSignature";
            const string clazz            = "class.this.trace.is.in";
            const string file             = @"c:\o2\temp\file\trace\is\in.cs";
            const string method           = "methodExectuted";
            const uint   taintPropagation = 0;
            var          text             = new List <string> {
                "this is a text inside a trace"
            };

            var o2Assessment = new O2Assessment();
            // Finding #1
            var o2Finding1 = new O2Finding("vulnName.Testing.TraceCreation", "vulnType.CustomType",
                                           "This is the Context",
                                           "This is the caller");

            o2Finding1.o2Traces.Add(new O2Trace
            {
                clazz            = clazz,
                columnNumber     = column_number,
                context          = context,
                file             = file,
                lineNumber       = line_number,
                method           = method,
                ordinal          = ordinal,
                signature        = signature,
                taintPropagation = taintPropagation,
                text             = text,
            });
            o2Assessment.o2Findings.Add(o2Finding1);

            // Finding #1
            const string sinkText           = "this is a sink";
            const string methodOnSinkPath   = "method call on sink path";
            const string methodOnSourcePath = "method call on source path";
            const string sourceText         = "this is a source";
            var          o2Finding2         = new O2Finding("Vulnerability.Name", "Vulnerability.Type");

            var o2Trace = new O2Trace("Class.Signature", "Method executed");

            var o2TraceOnSinkPath = new O2Trace(methodOnSinkPath, TraceType.Type_0);

            o2TraceOnSinkPath.childTraces.Add(new O2Trace(sinkText, TraceType.Known_Sink));

            var o2TraceOnSourcePath = new O2Trace(methodOnSourcePath, TraceType.Type_0);

            o2TraceOnSourcePath.childTraces.Add(new O2Trace(sourceText, TraceType.Source));

            o2Trace.childTraces.Add(o2TraceOnSourcePath);

            o2Trace.childTraces.Add(o2TraceOnSinkPath);

            o2Finding2.o2Traces = new List <IO2Trace> {
                o2Trace
            };

            o2Assessment.o2Findings.Add(o2Finding2);

            // save assessment file
            o2Assessment.save(o2AssessmentSave, sFileToCreate);

            // check if data was saved correctly
            var loadedO2Assessment = new O2Assessment(o2AssessmentLoad, sFileToCreate);

            List <IO2Finding> loadedO2Findings = loadedO2Assessment.o2Findings;

            Assert.IsTrue(loadedO2Assessment.o2Findings.Count == 2, "There should be 2 findings in the Assessment File");

            // in o2Findings1
            Assert.IsTrue(loadedO2Assessment.o2Findings[0].o2Traces.Count == 1,
                          "There should be 1 Trace in the Finding #1");

            IO2Trace loadedO2Trace = loadedO2Findings[0].o2Traces[0];

            Assert.IsTrue(loadedO2Trace.clazz == clazz, "clazz");
            Assert.IsTrue(loadedO2Trace.columnNumber == column_number, "columnNumber");
            Assert.IsTrue(loadedO2Trace.context == context, "context");
            Assert.IsTrue(loadedO2Trace.file == file, "file");
            Assert.IsTrue(loadedO2Trace.lineNumber == line_number, "lineNumber");
            Assert.IsTrue(loadedO2Trace.method == method, "method");
            Assert.IsTrue(loadedO2Trace.ordinal == ordinal, "ordinal");
            Assert.IsTrue(loadedO2Trace.signature == signature, "signature");
            Assert.IsTrue(loadedO2Trace.taintPropagation == taintPropagation, "taintPropagation");
            Assert.IsTrue(loadedO2Trace.text[0] == text[0], "text");

            // in o2Findings2
            Assert.IsTrue(loadedO2Assessment.o2Findings[1].o2Traces.Count == 1,
                          "There should be 1 Trace in the Finding #2");
            Assert.IsTrue(loadedO2Assessment.o2Findings[1].o2Traces[0].childTraces.Count == 2,
                          "There should be 2 child traces in this trace");

            Assert.IsNotNull(OzasmtUtils.getKnownSink(loadedO2Assessment.o2Findings[1].o2Traces), "Could not find Sink");
            Assert.IsTrue(OzasmtUtils.getKnownSink(loadedO2Assessment.o2Findings[1].o2Traces).clazz == sinkText,
                          "Sink text didn't match");

            Assert.IsTrue(OzasmtUtils.getSource(loadedO2Assessment.o2Findings[1].o2Traces).clazz == sourceText,
                          "Source text didn't match");
        }