노현종

코드 주석 정리

...@@ -27,6 +27,8 @@ namespace VulnCrawler ...@@ -27,6 +27,8 @@ namespace VulnCrawler
27 //AWS.account.Endpoint = "vulndb.cby38wfppa7l.us-east-2.rds.amazonaws.com"; 27 //AWS.account.Endpoint = "vulndb.cby38wfppa7l.us-east-2.rds.amazonaws.com";
28 //AWS.SaveAccount(); 28 //AWS.SaveAccount();
29 //AES aes = new AES(); 29 //AES aes = new AES();
30 +
31 + /* AWS 계정 정보 파일 읽음 */
30 string txt = File.ReadAllText(@"Account.xml"); 32 string txt = File.ReadAllText(@"Account.xml");
31 // string xml = aes.AESDecrypt128(txt, key); 33 // string xml = aes.AESDecrypt128(txt, key);
32 string xml = txt; 34 string xml = txt;
...@@ -34,15 +36,19 @@ namespace VulnCrawler ...@@ -34,15 +36,19 @@ namespace VulnCrawler
34 AWS.LoadAccount(xml); 36 AWS.LoadAccount(xml);
35 AWS.Account account = AWS.account; 37 AWS.Account account = AWS.account;
36 38
39 + /* AWS 정보 출력 */
37 Console.WriteLine($"Endpoint: {account.Endpoint}, ID: {account.Id}, PW: {account.Pw}"); 40 Console.WriteLine($"Endpoint: {account.Endpoint}, ID: {account.Id}, PW: {account.Pw}");
38 try 41 try
39 { 42 {
43 + /* DB 접속 시도 */
40 VulnRDS.Connect(account, "vuln"); 44 VulnRDS.Connect(account, "vuln");
41 } 45 }
42 catch(Exception e) 46 catch(Exception e)
43 { 47 {
44 Console.WriteLine($"접속 에러 :: {e.ToString()}"); 48 Console.WriteLine($"접속 에러 :: {e.ToString()}");
45 } 49 }
50 +
51 + /* AWS 연결 여부 확인 */
46 if (VulnRDS.Conn.State == System.Data.ConnectionState.Open) 52 if (VulnRDS.Conn.State == System.Data.ConnectionState.Open)
47 { 53 {
48 Console.WriteLine("접속 성공"); 54 Console.WriteLine("접속 성공");
...@@ -53,44 +59,18 @@ namespace VulnCrawler ...@@ -53,44 +59,18 @@ namespace VulnCrawler
53 Console.WriteLine("연결 실패"); 59 Console.WriteLine("연결 실패");
54 return; 60 return;
55 } 61 }
56 - //MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder {
57 - // Server = "",
58 - // UserID = id,
59 - // Password = pw,
60 - // Database = "vuln",
61 - // Port = 3306
62 - //};
63 -
64 - //string strConn = builder.ToString();
65 - //builder = null;
66 - //MySqlConnection conn = new MySqlConnection(strConn);
67 -
68 - //try {
69 -
70 - // String sql = "INSERT INTO members (id, pwd, name) " +
71 - // "VALUES ('gon', '111', '김삿갓')";
72 -
73 - // MySqlCommand cmd = new MySqlCommand(sql, conn);
74 -
75 - // conn.Open();
76 -
77 - // cmd.ExecuteNonQuery();
78 - // conn.Close();
79 - //} catch (Exception e) {
80 - // Console.WriteLine(e.ToString());
81 - //}
82 #endregion 62 #endregion
83 63
84 Run(); 64 Run();
85 65
86 } 66 }
67 +
68 + /* 메인 동작 함수 */
87 public static void Run() { 69 public static void Run() {
88 // Repository 폴더들이 있는 주소를 지정하면 하위 폴더 목록을 가져옴(Repository 목록) 70 // Repository 폴더들이 있는 주소를 지정하면 하위 폴더 목록을 가져옴(Repository 목록)
89 Regex.CacheSize = 50; 71 Regex.CacheSize = 50;
90 72
91 - // var fields = VulnWorker.GetCriticalVariant(@"return _is_safe_url(url, host) and _is_safe_url(url.replace('\\', '/'), host)"); 73 + /* C:\VulnC에 있는 Git Repository들로 돌아감 */
92 -
93 - // return;
94 var directorys = Directory.GetDirectories(@"c:\VulnC"); 74 var directorys = Directory.GetDirectories(@"c:\VulnC");
95 if (directorys.Length == 0) { 75 if (directorys.Length == 0) {
96 Console.WriteLine("Repository 목록 찾기 실패"); 76 Console.WriteLine("Repository 목록 찾기 실패");
...@@ -98,16 +78,15 @@ namespace VulnCrawler ...@@ -98,16 +78,15 @@ namespace VulnCrawler
98 } 78 }
99 // Repository 목록 만큼 반복함. 79 // Repository 목록 만큼 반복함.
100 foreach (var directory in directorys) { 80 foreach (var directory in directorys) {
101 - // 템플릿 패턴화 T : VulnAbstractCrawler 81 + /* 폴더 중에 linux가 있으면 잠깐 넘어감 (너무 커서 테스트 힘듦) */
102 - if (directory.Contains("open")) 82 + if (directory.Contains("linux"))
103 { 83 {
104 continue; 84 continue;
105 } 85 }
106 - Console.WriteLine(directory); 86 + // 템플릿 패턴화 T : VulnAbstractCrawler
107 VulnWorker.Run<VulnC>(directory); 87 VulnWorker.Run<VulnC>(directory);
108 } 88 }
109 } 89 }
110 -
111 #region Secure string input 90 #region Secure string input
112 static String SecureStringToString(SecureString value) { 91 static String SecureStringToString(SecureString value) {
113 IntPtr valuePtr = IntPtr.Zero; 92 IntPtr valuePtr = IntPtr.Zero;
......
...@@ -10,14 +10,27 @@ namespace VulnCrawler ...@@ -10,14 +10,27 @@ namespace VulnCrawler
10 { 10 {
11 public class VulnC : VulnAbstractCrawler 11 public class VulnC : VulnAbstractCrawler
12 { 12 {
13 -// protected override string RegexFuncPattern => $@"@@ \-(?<{OldStart}>\d+),(?<{OldLines}>\d+) \+(?<{NewStart}>\d+),(?<{NewLines}>\d+) @@ (?<{MethodName}>(static)?( const )? [\w]+ [\w]+\([\w \*\,\t\n]*[\)\,])"; 13 + // protected override string RegexFuncPattern => $@"@@ \-(?<{OldStart}>\d+),(?<{OldLines}>\d+) \+(?<{NewStart}>\d+),(?<{NewLines}>\d+) @@ (?<{MethodName}>(static)?( const )? [\w]+ [\w]+\([\w \*\,\t\n]*[\)\,])";
14 + /* 함수 패턴 정규식 */
14 protected override string RegexFuncPattern => $@"(?<{MethodName}>(unsigned|static)?( const )? [\w]+ [\w]+\(([\w \*\,\t\n])*[\)\,])"; 15 protected override string RegexFuncPattern => $@"(?<{MethodName}>(unsigned|static)?( const )? [\w]+ [\w]+\(([\w \*\,\t\n])*[\)\,])";
16 + /* 검색 파일 타입 */
15 protected override string Extension => ".c"; 17 protected override string Extension => ".c";
18 + /* 예약어 파일명 */
16 protected override string ReservedFileName => "CReserved.txt"; 19 protected override string ReservedFileName => "CReserved.txt";
20 + /// <summary>
21 + /// 패치 코드에서 함수 목록 뽑는 정규식
22 + /// </summary>
23 + /// <param name="patchCode">패치 코드</param>
24 + /// <returns></returns>
17 public override MatchCollection GetMatches(string patchCode) { 25 public override MatchCollection GetMatches(string patchCode) {
18 var regs = Regex.Matches(patchCode, RegexFuncPattern); 26 var regs = Regex.Matches(patchCode, RegexFuncPattern);
19 return regs; 27 return regs;
20 } 28 }
29 + /// <summary>
30 + /// 주석 제거 함수 (안쓰임)
31 + /// </summary>
32 + /// <param name="original"></param>
33 + /// <returns></returns>
21 public override string RemoveComment(string original) { 34 public override string RemoveComment(string original) {
22 string txt = Regex.Replace(original, Environment.NewLine, ""); 35 string txt = Regex.Replace(original, Environment.NewLine, "");
23 36
...@@ -32,6 +45,11 @@ namespace VulnCrawler ...@@ -32,6 +45,11 @@ namespace VulnCrawler
32 return replace; 45 return replace;
33 } 46 }
34 47
48 + /// <summary>
49 + /// 패치 정보에서 크리티컬 메서드 테이블 구함
50 + /// </summary>
51 + /// <param name="srcCode">원본 소스 코드</param>
52 + /// <returns>키 = 크리티컬 메서드명, 값 = 크리티컬 변수 목록</returns>
35 public override IDictionary<string, IEnumerable<string>> ExtractGitCriticalMethodTable(string srcCode) 53 public override IDictionary<string, IEnumerable<string>> ExtractGitCriticalMethodTable(string srcCode)
36 { 54 {
37 var table = new Dictionary<string, IEnumerable<string>>(); 55 var table = new Dictionary<string, IEnumerable<string>>();
...@@ -105,6 +123,12 @@ namespace VulnCrawler ...@@ -105,6 +123,12 @@ namespace VulnCrawler
105 } 123 }
106 return table; 124 return table;
107 } 125 }
126 + /// <summary>
127 + /// 원본 함수 코드 구해주는 함수
128 + /// </summary>
129 + /// <param name="oldStream">원본 코드 파일</param>
130 + /// <param name="methodName">찾을 메서드 이름</param>
131 + /// <returns></returns>
108 protected override string GetOriginalFunc(Stream oldStream, string methodName) { 132 protected override string GetOriginalFunc(Stream oldStream, string methodName) {
109 StringBuilder oldBuilder = new StringBuilder(); 133 StringBuilder oldBuilder = new StringBuilder();
110 string method = Regex.Escape(methodName); 134 string method = Regex.Escape(methodName);
...@@ -244,6 +268,12 @@ namespace VulnCrawler ...@@ -244,6 +268,12 @@ namespace VulnCrawler
244 return oldBuilder.ToString(); 268 return oldBuilder.ToString();
245 } 269 }
246 270
271 + /// <summary>
272 + /// 크리티컬 블록 리스트 구하는 함수
273 + /// </summary>
274 + /// <param name="srcCode">원본 함수 코드</param>
275 + /// <param name="criticalList">크리티컬 변수 목록</param>
276 + /// <returns></returns>
247 protected override IList<Block> GetCriticalBlocks(string srcCode, IEnumerable<string> criticalList) 277 protected override IList<Block> GetCriticalBlocks(string srcCode, IEnumerable<string> criticalList)
248 { 278 {
249 279
...@@ -471,6 +501,13 @@ namespace VulnCrawler ...@@ -471,6 +501,13 @@ namespace VulnCrawler
471 return blockList; 501 return blockList;
472 } 502 }
473 503
504 + /// <summary>
505 + /// 추상화 정규화 함수
506 + /// </summary>
507 + /// <param name="blockCode">블록 소스 코드</param>
508 + /// <param name="dict">추상화 변환 변수 테이블</param>
509 + /// <param name="methodDict">추상화 변환 메서드 테이블</param>
510 + /// <returns></returns>
474 public override string Abstract(string blockCode, IDictionary<string, string> dict, IDictionary<string, string> methodDict) 511 public override string Abstract(string blockCode, IDictionary<string, string> dict, IDictionary<string, string> methodDict)
475 { 512 {
476 var split = blockCode.Split('\n'); 513 var split = blockCode.Split('\n');
......
...@@ -16,7 +16,9 @@ namespace VulnCrawler ...@@ -16,7 +16,9 @@ namespace VulnCrawler
16 // 템플릿 메서드 패턴 16 // 템플릿 메서드 패턴
17 public static void Run<T>(string dirPath) where T : VulnAbstractCrawler, new() { 17 public static void Run<T>(string dirPath) where T : VulnAbstractCrawler, new() {
18 var crawler = new T(); 18 var crawler = new T();
19 + /* Git 경로로 초기화 */
19 crawler.Init(dirPath); 20 crawler.Init(dirPath);
21 + /* 초기화된 커밋 목록 가져옴 */
20 var commits = crawler.Commits; 22 var commits = crawler.Commits;
21 foreach (var commit in commits) { 23 foreach (var commit in commits) {
22 // 커밋 메시지 24 // 커밋 메시지
...@@ -31,17 +33,15 @@ namespace VulnCrawler ...@@ -31,17 +33,15 @@ namespace VulnCrawler
31 // 패치 엔트리 파일 배열 중에 파일 확장자가 .py인 것만 가져옴 33 // 패치 엔트리 파일 배열 중에 파일 확장자가 .py인 것만 가져옴
32 // (실질적인 코드 변경 커밋만 보기 위해서) 34 // (실질적인 코드 변경 커밋만 보기 위해서)
33 var entrys = crawler.GetPatchEntryChanges(patch); 35 var entrys = crawler.GetPatchEntryChanges(patch);
34 - 36 + /* C:\VulnC\linux 라면 linux만 뽑아서 repoName에 저장 */
35 var dsp = dirPath.Split(Path.DirectorySeparatorChar); 37 var dsp = dirPath.Split(Path.DirectorySeparatorChar);
36 string repoName = dsp[dsp.Length - 1]; 38 string repoName = dsp[dsp.Length - 1];
37 // 현재 커밋에 대한 패치 엔트리 배열을 출력함 39 // 현재 커밋에 대한 패치 엔트리 배열을 출력함
38 PrintPatchEntrys(entrys, crawler, message, cve, repoName); 40 PrintPatchEntrys(entrys, crawler, message, cve, repoName);
41 + Console.ReadLine();
39 } 42 }
40 - // Console.ReadLine();
41 -
42 } 43 }
43 } 44 }
44 -
45 45
46 private static void PrintPatchEntrys(IEnumerable<PatchEntryChanges> entrys, VulnAbstractCrawler self, string commitMsg, string cve, string repoName) { 46 private static void PrintPatchEntrys(IEnumerable<PatchEntryChanges> entrys, VulnAbstractCrawler self, string commitMsg, string cve, string repoName) {
47 foreach (var entry in entrys) { 47 foreach (var entry in entrys) {
...@@ -72,10 +72,6 @@ namespace VulnCrawler ...@@ -72,10 +72,6 @@ namespace VulnCrawler
72 Console.WriteLine($"Old Content: \n{oldContent}"); 72 Console.WriteLine($"Old Content: \n{oldContent}");
73 Console.ResetColor(); 73 Console.ResetColor();
74 74
75 - //Console.BackgroundColor = ConsoleColor.DarkMagenta;
76 - //Console.WriteLine($"New Content: \n{newContent}");
77 - //Console.ResetColor();
78 -
79 Console.ForegroundColor = ConsoleColor.Blue; 75 Console.ForegroundColor = ConsoleColor.Blue;
80 Console.WriteLine($"status: {entry.Status.ToString()}"); 76 Console.WriteLine($"status: {entry.Status.ToString()}");
81 Console.WriteLine($"added: {entry.LinesAdded.ToString()}, deleted: {entry.LinesDeleted.ToString()}"); 77 Console.WriteLine($"added: {entry.LinesAdded.ToString()}, deleted: {entry.LinesDeleted.ToString()}");
...@@ -94,15 +90,26 @@ namespace VulnCrawler ...@@ -94,15 +90,26 @@ namespace VulnCrawler
94 Console.BackgroundColor = ConsoleColor.DarkRed; 90 Console.BackgroundColor = ConsoleColor.DarkRed;
95 Console.WriteLine($"Patched: \n{entry.Patch}"); 91 Console.WriteLine($"Patched: \n{entry.Patch}");
96 Console.ResetColor(); 92 Console.ResetColor();
93 + /* 패치된 코드들에서 Method로 나누고 크리티컬 변수로 뽑아옴 Dictionary 구조 (키 = 함수명) */
97 var table = self.ExtractGitCriticalMethodTable(entry.Patch); 94 var table = self.ExtractGitCriticalMethodTable(entry.Patch);
95 + /* 크리티컬 메서드 테이블과 패치 전 파일에서 Process 하고 tuple로 가져옴 */
98 foreach (var tuple in self.Process(oldBlob, table)) 96 foreach (var tuple in self.Process(oldBlob, table))
99 { 97 {
98 + /* 메서드 이름, 원본 함수 코드, 블록 리스트(크리티컬 포함) */
100 (var methodName, var oriFunc, var blocks) = tuple; 99 (var methodName, var oriFunc, var blocks) = tuple;
101 Console.BackgroundColor = ConsoleColor.DarkRed; 100 Console.BackgroundColor = ConsoleColor.DarkRed;
102 Console.WriteLine($"메서드 이름 : {methodName}"); 101 Console.WriteLine($"메서드 이름 : {methodName}");
103 Console.ResetColor(); 102 Console.ResetColor();
104 foreach (var block in blocks) 103 foreach (var block in blocks)
105 { 104 {
105 + /* 크리티컬 블록이 아니면 볼 필요 없으니 넘어감 */
106 + if (!block.HasCritical)
107 + {
108 + // Console.WriteLine("크리티컬 아님");
109 + continue;
110 + }
111 +
112 +
106 if (block.HasCritical) 113 if (block.HasCritical)
107 { 114 {
108 Console.BackgroundColor = ConsoleColor.DarkMagenta; 115 Console.BackgroundColor = ConsoleColor.DarkMagenta;
...@@ -111,22 +118,19 @@ namespace VulnCrawler ...@@ -111,22 +118,19 @@ namespace VulnCrawler
111 { 118 {
112 Console.BackgroundColor = ConsoleColor.DarkGreen; 119 Console.BackgroundColor = ConsoleColor.DarkGreen;
113 } 120 }
121 + /* 블록 정보 출력(블록 번호, 블록 소스코드, 블록 추상화 코드, 블록 해쉬값) */
114 Console.WriteLine($"=====block({block.Num}, {block.HasCritical.ToString()})"); 122 Console.WriteLine($"=====block({block.Num}, {block.HasCritical.ToString()})");
115 Console.WriteLine(block.Code); 123 Console.WriteLine(block.Code);
116 Console.ResetColor(); 124 Console.ResetColor();
117 Console.WriteLine($"AbsCode = \n{block.AbsCode}"); 125 Console.WriteLine($"AbsCode = \n{block.AbsCode}");
118 Console.WriteLine($"MD5 = {block.Hash}"); 126 Console.WriteLine($"MD5 = {block.Hash}");
119 127
120 - if (!block.HasCritical) 128 + /* base64 인코딩(MySQL에 들어갈 수 없는 문자열이 있을 수 있으므로 인코딩) */
121 - {
122 - // Console.WriteLine("크리티컬 아님");
123 - continue;
124 - }
125 -
126 byte[] funcNameBytes = Encoding.Unicode.GetBytes(methodName); 129 byte[] funcNameBytes = Encoding.Unicode.GetBytes(methodName);
127 byte[] codeOriBeforeBytes = Encoding.Unicode.GetBytes(oriFunc); 130 byte[] codeOriBeforeBytes = Encoding.Unicode.GetBytes(oriFunc);
128 byte[] codeAbsBeforeBytes = Encoding.Unicode.GetBytes(block.AbsCode); 131 byte[] codeAbsBeforeBytes = Encoding.Unicode.GetBytes(block.AbsCode);
129 132
133 + /* VulnDB에 하나의 레코드로 들어가는 하나의 취약점 객체 */
130 VulnRDS.Vuln vuln = new VulnRDS.Vuln() 134 VulnRDS.Vuln vuln = new VulnRDS.Vuln()
131 { 135 {
132 Cve = cve, 136 Cve = cve,
...@@ -140,76 +144,22 @@ namespace VulnCrawler ...@@ -140,76 +144,22 @@ namespace VulnCrawler
140 BlockNum = block.Num, 144 BlockNum = block.Num,
141 145
142 }; 146 };
143 - // Console.WriteLine("추가중..."); 147 + Console.WriteLine($"Vuln FuncName:{vuln.FuncName}");
148 + /* VulnDB에 추가 */
144 VulnRDS.InsertVulnData(vuln); 149 VulnRDS.InsertVulnData(vuln);
145 -
146 - // Console.WriteLine($"추가: {vuln.Cve}, {vuln.FuncName}, {vuln.RepositName}");
147 - // Console.ReadLine();
148 -
149 -
150 } 150 }
151 -
152 } 151 }
153 -
154 -
155 - //foreach (var item in table)
156 - //{
157 - // Console.WriteLine($"Method : {item.Key}");
158 - // //foreach (var b in item.Value)
159 - // //{
160 - // // Console.WriteLine($"--{b}");
161 - // //}
162 -
163 - //}
164 - // Console.ReadLine();
165 } 152 }
166 else 153 else
167 { 154 {
168 continue; 155 continue;
169 } 156 }
170 157
171 -
172 -
173 - // 패치 코드에서 매칭된 파이썬 함수들로부터
174 - // 패치 전 코드 파일(oldBlob)을 탐색하여 원본 파이썬 함수 가져오고(originalFunc)
175 - //
176 #endregion 158 #endregion
177 159
178 - //foreach (var reg in regs)
179 - //{
180 -
181 - // var match = reg as Match;
182 - // string methodName = match.Groups[VulnAbstractCrawler.MethodName].Value.Trim();
183 - // string originalFunc, md5;
184 - // (originalFunc, md5) = self.Process(oldBlob.GetContentStream(),
185 - // methodName);
186 -
187 -
188 -
189 - // #region 현재 패치 엔트리 정보 출력(추가된 줄 수, 삭제된 줄 수, 패치 이전 경로, 패치 후 경로)
190 -
191 -
192 - // // 패치 전 원본 함수
193 - // Console.WriteLine($"Original Func: {originalFunc}");
194 - // // 해쉬 후
195 - // Console.WriteLine($"Original Func MD5: {md5}");
196 - // //Console.BackgroundColor = ConsoleColor.DarkRed;
197 - // //Console.WriteLine($"Patched: \n{entry.Patch}");
198 -
199 - // Console.ResetColor();
200 - // Console.ForegroundColor = ConsoleColor.Red;
201 - // Console.WriteLine("==============================");
202 - // Console.ResetColor();
203 - // #endregion
204 -
205 - //}
206 - //Console.ReadLine();
207 } 160 }
208 catch (Exception e) 161 catch (Exception e)
209 { 162 {
210 - // Console.WriteLine(entry.Patch);
211 - // Console.WriteLine(e.ToString());
212 - // Console.ReadLine();
213 continue; 163 continue;
214 } 164 }
215 165
......