노현종

GetCriticalBlocks 크리티컬 블록 선정

90% 완성
크리티컬 변수가 참조된 블록 선정은 잘 되지만

블록 중에 코드 라인이 누락되는 경우 발생
...@@ -104,8 +104,9 @@ namespace VulnCrawler ...@@ -104,8 +104,9 @@ namespace VulnCrawler
104 /// <param name="oldStream">파일 스트림</param> 104 /// <param name="oldStream">파일 스트림</param>
105 /// <param name="methodName">찾을 메서드 이름</param> 105 /// <param name="methodName">찾을 메서드 이름</param>
106 /// <returns>함수 문자열</returns> 106 /// <returns>함수 문자열</returns>
107 - protected abstract string GetOriginalFunc(Stream oldStream, string methodName); 107 + protected abstract string GetOriginalFunc(Stream oldStream, string methodName);
108 - 108 +
109 + protected abstract IList<string> GetCriticalBlocks(string srcCode, IEnumerable<string> criticalList);
109 /// <summary> 110 /// <summary>
110 /// 성능 개선을 위한 111 /// 성능 개선을 위한
111 /// 코드 라인 위치 기반 취약 원본 함수 추출 테스트용 함수 곧 삭제 예정 112 /// 코드 라인 위치 기반 취약 원본 함수 추출 테스트용 함수 곧 삭제 예정
...@@ -231,15 +232,33 @@ namespace VulnCrawler ...@@ -231,15 +232,33 @@ namespace VulnCrawler
231 /// <param name="oldStream"></param> 232 /// <param name="oldStream"></param>
232 /// <param name="methodName"></param> 233 /// <param name="methodName"></param>
233 /// <returns></returns> 234 /// <returns></returns>
234 - public virtual (string originalFunc, string hash) Process(Stream oldStream, string methodName, int start) { 235 + public virtual IEnumerable<(string originalFunc, string hash)> Process(Blob oldBlob, IDictionary<string, IEnumerable<string>> table) {
235 - // 패치 전 원본 함수 구하고 236 + foreach (var item in table)
236 - string func = GetOriginalFunc(oldStream, methodName); 237 + {
237 - // 주석 제거하고 238 + string methodName = item.Key;
238 - //func = RemoveComment(func); 239 + // 패치 전 원본 파일 스트림
239 - // 해쉬하고 240 + Stream oldStream = oldBlob.GetContentStream();
240 - string md5 = MD5HashFunc(func); 241 + // 패치 전 원본 함수 구하고
241 - // 튜플로 반환 242 + string func = GetOriginalFunc(oldStream, methodName);
242 - return (func, md5); 243 + Console.WriteLine(func);
244 + string bs = string.Empty;
245 + string md5 = string.Empty;
246 + int blockNum = 1;
247 + if (item.Value.Count() != 0)
248 + {
249 + var blocks = GetCriticalBlocks(func, item.Value);
250 + StringBuilder builder = new StringBuilder();
251 + foreach (var block in blocks)
252 + {
253 + Console.WriteLine($"=====block({blockNum})");
254 + Console.WriteLine(block);
255 + builder.AppendLine(block);
256 + }
257 + bs = builder.ToString();
258 + md5 = MD5HashFunc(bs);
259 + }
260 + yield return (bs, md5);
261 + }
243 } 262 }
244 /// <summary> 263 /// <summary>
245 /// 주석 제거 함수 264 /// 주석 제거 함수
......
...@@ -99,10 +99,8 @@ namespace VulnCrawler ...@@ -99,10 +99,8 @@ namespace VulnCrawler
99 } 99 }
100 return table; 100 return table;
101 } 101 }
102 -
103 protected override string GetOriginalFunc(Stream oldStream, string methodName) { 102 protected override string GetOriginalFunc(Stream oldStream, string methodName) {
104 StringBuilder oldBuilder = new StringBuilder(); 103 StringBuilder oldBuilder = new StringBuilder();
105 -
106 string method = Regex.Escape(methodName); 104 string method = Regex.Escape(methodName);
107 using (var reader = new StreamReader(oldStream)) { 105 using (var reader = new StreamReader(oldStream)) {
108 bool found = false; 106 bool found = false;
...@@ -115,12 +113,10 @@ namespace VulnCrawler ...@@ -115,12 +113,10 @@ namespace VulnCrawler
115 string commentPattern3 = @"\*\/"; 113 string commentPattern3 = @"\*\/";
116 while (!reader.EndOfStream) { 114 while (!reader.EndOfStream) {
117 string line = reader.ReadLine(); 115 string line = reader.ReadLine();
118 -
119 // 메서드를 찾은 경우 116 // 메서드를 찾은 경우
120 if (found) 117 if (found)
121 { 118 {
122 string trim = line.Trim(); 119 string trim = line.Trim();
123 -
124 // 범위 주석 진행되고 있으면 넘어감 120 // 범위 주석 진행되고 있으면 넘어감
125 if (commentLine) 121 if (commentLine)
126 { 122 {
...@@ -135,10 +131,8 @@ namespace VulnCrawler ...@@ -135,10 +131,8 @@ namespace VulnCrawler
135 continue; 131 continue;
136 } 132 }
137 } 133 }
138 -
139 // "" 문자열 제거 134 // "" 문자열 제거
140 string removeString = Regex.Replace(trim, stringPattern, ""); 135 string removeString = Regex.Replace(trim, stringPattern, "");
141 -
142 // /* ~ 패턴 136 // /* ~ 패턴
143 if (Regex.IsMatch(trim, commentPattern2)) 137 if (Regex.IsMatch(trim, commentPattern2))
144 { 138 {
...@@ -156,7 +150,6 @@ namespace VulnCrawler ...@@ -156,7 +150,6 @@ namespace VulnCrawler
156 { 150 {
157 continue; 151 continue;
158 } 152 }
159 -
160 int openBracketCount = removeString.Count(c => c == '{'); 153 int openBracketCount = removeString.Count(c => c == '{');
161 int closeBracketCount = removeString.Count(c => c == '}'); 154 int closeBracketCount = removeString.Count(c => c == '}');
162 int subtract = openBracketCount - closeBracketCount; 155 int subtract = openBracketCount - closeBracketCount;
...@@ -170,7 +163,6 @@ namespace VulnCrawler ...@@ -170,7 +163,6 @@ namespace VulnCrawler
170 { 163 {
171 break; 164 break;
172 } 165 }
173 -
174 } 166 }
175 else // 메서드는 찾았으나 아직 시작 괄호를 못찾은 경우 167 else // 메서드는 찾았으나 아직 시작 괄호를 못찾은 경우
176 { 168 {
...@@ -189,10 +181,7 @@ namespace VulnCrawler ...@@ -189,10 +181,7 @@ namespace VulnCrawler
189 continue; 181 continue;
190 } 182 }
191 } 183 }
192 -
193 } 184 }
194 -
195 -
196 } 185 }
197 // 아직 메서드를 못찾은 경우 186 // 아직 메서드를 못찾은 경우
198 else 187 else
...@@ -217,7 +206,6 @@ namespace VulnCrawler ...@@ -217,7 +206,6 @@ namespace VulnCrawler
217 { 206 {
218 continue; 207 continue;
219 } 208 }
220 -
221 // 만약 찾은 메서드 라인에서 중괄호 {가 시작된 경우 209 // 만약 찾은 메서드 라인에서 중괄호 {가 시작된 경우
222 if (Regex.Match(trim, $@"{method}\s*" + @"\{").Success) 210 if (Regex.Match(trim, $@"{method}\s*" + @"\{").Success)
223 { 211 {
...@@ -235,15 +223,88 @@ namespace VulnCrawler ...@@ -235,15 +223,88 @@ namespace VulnCrawler
235 } 223 }
236 } 224 }
237 } 225 }
238 -
239 } 226 }
240 - //Console.WriteLine(oldBuilder.ToString());
241 - //Console.ReadLine();
242 -
243 return oldBuilder.ToString(); 227 return oldBuilder.ToString();
244 } 228 }
245 229
246 - 230 + protected override IList<string> GetCriticalBlocks(string srcCode, IEnumerable<string> criticalList)
231 + {
232 + var split = srcCode.Split('\n');
233 + int bracketCount = 0;
234 + var blockList = new List<string>();
235 + StringBuilder builder = new StringBuilder();
236 + var crList = criticalList as HashSet<string>;
237 + if (crList == null)
238 + {
239 + return null;
240 + }
241 + bool mainLine = true; /* 현재 라인이 메인 코드 라인인지 */
242 + foreach (var line in split)
243 + {
244 + string trim = line.Trim();
245 + /* 중괄호 수 세기 */
246 + int openBracketCount = trim.Count(c => c == '{');
247 + int closeBracketCount = trim.Count(c => c == '}');
248 + int subtract = openBracketCount - closeBracketCount;
249 + bracketCount += subtract;
247 250
251 + /* 중괄호 연산 결과 1이라는 것은 메인 라인 */
252 + if (bracketCount == 1)
253 + {
254 + /*
255 + * 깊이가 1인데 mainLine이
256 + * false 이면 넘어왔다는 것이니 현재까지 코드
257 + * blockList에 추가
258 + */
259 + if (!mainLine)
260 + {
261 + string s = builder.ToString();
262 + if (!string.IsNullOrWhiteSpace(s))
263 + {
264 + blockList.Add(s);
265 + builder.Clear();
266 + }
267 + }
268 + mainLine = true;
269 + }
270 + /* 2 이상이라는 건 메인 라인 X */
271 + else if(bracketCount >= 2)
272 + {
273 + /*
274 + * 깊이가 2 이상인데 mainLine이
275 + * true면 넘어왔다는 것이니 현재까지 코드
276 + * blockList에 추가
277 + */
278 + if (mainLine)
279 + {
280 + string s = builder.ToString();
281 + if (!string.IsNullOrWhiteSpace(s))
282 + {
283 + blockList.Add(s);
284 + builder.Clear();
285 + }
286 + }
287 + mainLine = false;
288 + }
289 + /* 이도 저도 아니면 그냥 넘어감 */
290 + else
291 + {
292 + continue;
293 + }
294 +
295 + /* 현재 코드 라인에서 변수 추출시켜서 크리티컬 리스트와 대조 */
296 + foreach (var var in ExtractCriticalVariant(line))
297 + {
298 + /* 크리티컬 리스트에 추출한 변수가 들어있다면 추가 */
299 + if (criticalList.Contains(var))
300 + {
301 + builder.AppendLine(line);
302 + break;
303 + }
304 + }
305 +
306 + }
307 + return blockList;
308 + }
248 } 309 }
249 } 310 }
......
...@@ -70,5 +70,10 @@ namespace VulnCrawler ...@@ -70,5 +70,10 @@ namespace VulnCrawler
70 { 70 {
71 throw new NotImplementedException(); 71 throw new NotImplementedException();
72 } 72 }
73 +
74 + protected override IList<string> GetCriticalBlocks(string srcCode, IEnumerable<string> criticalList)
75 + {
76 + throw new NotImplementedException();
77 + }
73 } 78 }
74 } 79 }
......
...@@ -89,14 +89,28 @@ namespace VulnCrawler ...@@ -89,14 +89,28 @@ namespace VulnCrawler
89 Console.ResetColor(); 89 Console.ResetColor();
90 90
91 var table = self.ExtractGitCriticalMethodTable(entry.Patch); 91 var table = self.ExtractGitCriticalMethodTable(entry.Patch);
92 - foreach (var item in table) 92 + string originalFunc = string.Empty, md5 = string.Empty;
93 + foreach (var tuple in self.Process(oldBlob, table))
93 { 94 {
94 - Console.WriteLine($"Method : {item.Key}"); 95 + Console.WriteLine("===z");
95 - foreach (var b in item.Value) 96 + (originalFunc, md5) = tuple;
96 - { 97 + // 패치 전 원본 함수
97 - Console.WriteLine($"--{b}"); 98 + Console.WriteLine($"Original Func: {originalFunc}");
98 - } 99 + // 해쉬 후
100 + Console.WriteLine($"Original Func MD5: {md5}");
101 +
99 } 102 }
103 +
104 +
105 + //foreach (var item in table)
106 + //{
107 + // Console.WriteLine($"Method : {item.Key}");
108 + // //foreach (var b in item.Value)
109 + // //{
110 + // // Console.WriteLine($"--{b}");
111 + // //}
112 +
113 + //}
100 Console.ReadLine(); 114 Console.ReadLine();
101 } 115 }
102 else 116 else
...@@ -111,37 +125,35 @@ namespace VulnCrawler ...@@ -111,37 +125,35 @@ namespace VulnCrawler
111 // 125 //
112 #endregion 126 #endregion
113 127
114 - foreach (var reg in regs) 128 + //foreach (var reg in regs)
115 - { 129 + //{
116 130
117 - var match = reg as Match; 131 + // var match = reg as Match;
118 - string methodName = match.Groups[VulnAbstractCrawler.MethodName].Value.Trim(); 132 + // string methodName = match.Groups[VulnAbstractCrawler.MethodName].Value.Trim();
119 - int start = 0; //int.Parse(match.Groups[VulnAbstractCrawler.OldStart].Value); 133 + // string originalFunc, md5;
120 - // Console.WriteLine("methodName = " + methodName); 134 + // (originalFunc, md5) = self.Process(oldBlob.GetContentStream(),
121 - string originalFunc, md5; 135 + // methodName);
122 - (originalFunc, md5) = self.Process(oldBlob.GetContentStream(),
123 - methodName, start);
124 136
125 137
126 138
127 - #region 현재 패치 엔트리 정보 출력(추가된 , 삭제된 , 패치 이전 경로, 패치 경로) 139 + // #region 현재 패치 엔트리 정보 출력(추가된 줄 수, 삭제된 줄 수, 패치 이전 경로, 패치 후 경로)
128 140
129 141
130 - // 패치 전 원본 함수 142 + // // 패치 전 원본 함수
131 - Console.WriteLine($"Original Func: {originalFunc}"); 143 + // Console.WriteLine($"Original Func: {originalFunc}");
132 - // 해쉬 후 144 + // // 해쉬 후
133 - Console.WriteLine($"Original Func MD5: {md5}"); 145 + // Console.WriteLine($"Original Func MD5: {md5}");
134 - //Console.BackgroundColor = ConsoleColor.DarkRed; 146 + // //Console.BackgroundColor = ConsoleColor.DarkRed;
135 - //Console.WriteLine($"Patched: \n{entry.Patch}"); 147 + // //Console.WriteLine($"Patched: \n{entry.Patch}");
136 - 148 +
137 - Console.ResetColor(); 149 + // Console.ResetColor();
138 - Console.ForegroundColor = ConsoleColor.Red; 150 + // Console.ForegroundColor = ConsoleColor.Red;
139 - Console.WriteLine("=============================="); 151 + // Console.WriteLine("==============================");
140 - Console.ResetColor(); 152 + // Console.ResetColor();
141 - #endregion 153 + // #endregion
142 - 154 +
143 - } 155 + //}
144 - Console.ReadLine(); 156 + //Console.ReadLine();
145 } 157 }
146 catch (Exception e) 158 catch (Exception e)
147 { 159 {
......