GetCriticalBlocks 크리티컬 블록 선정
90% 완성 크리티컬 변수가 참조된 블록 선정은 잘 되지만 블록 중에 코드 라인이 누락되는 경우 발생
Showing
4 changed files
with
156 additions
and
59 deletions
... | @@ -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 | { | ... | ... |
-
Please register or login to post a comment