Toggle navigation
Toggle navigation
This project
Loading...
Sign in
노현종
/
2018-1-Capstone1-VulnNotti
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
노현종
2018-05-30 20:13:23 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
92349a84f7cdc016d17177585630db58af53b1cc
92349a84
1 parent
e4269113
코드 주석 정리
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
70 additions
and
104 deletions
Vulnerablity_DB/VulnCrawler/Program.cs
Vulnerablity_DB/VulnCrawler/VulnC.cs
Vulnerablity_DB/VulnCrawler/VulnWorker.cs
Vulnerablity_DB/VulnCrawler/Program.cs
View file @
92349a8
...
...
@@ -27,6 +27,8 @@ namespace VulnCrawler
//AWS.account.Endpoint = "vulndb.cby38wfppa7l.us-east-2.rds.amazonaws.com";
//AWS.SaveAccount();
//AES aes = new AES();
/* AWS 계정 정보 파일 읽음 */
string
txt
=
File
.
ReadAllText
(
@"Account.xml"
);
// string xml = aes.AESDecrypt128(txt, key);
string
xml
=
txt
;
...
...
@@ -34,15 +36,19 @@ namespace VulnCrawler
AWS
.
LoadAccount
(
xml
);
AWS
.
Account
account
=
AWS
.
account
;
/* AWS 정보 출력 */
Console
.
WriteLine
(
$
"Endpoint: {account.Endpoint}, ID: {account.Id}, PW: {account.Pw}"
);
try
{
/* DB 접속 시도 */
VulnRDS
.
Connect
(
account
,
"vuln"
);
}
catch
(
Exception
e
)
{
Console
.
WriteLine
(
$
"접속 에러 :: {e.ToString()}"
);
}
/* AWS 연결 여부 확인 */
if
(
VulnRDS
.
Conn
.
State
==
System
.
Data
.
ConnectionState
.
Open
)
{
Console
.
WriteLine
(
"접속 성공"
);
...
...
@@ -53,44 +59,18 @@ namespace VulnCrawler
Console
.
WriteLine
(
"연결 실패"
);
return
;
}
//MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder {
// Server = "",
// UserID = id,
// Password = pw,
// Database = "vuln",
// Port = 3306
//};
//string strConn = builder.ToString();
//builder = null;
//MySqlConnection conn = new MySqlConnection(strConn);
//try {
// String sql = "INSERT INTO members (id, pwd, name) " +
// "VALUES ('gon', '111', '김삿갓')";
// MySqlCommand cmd = new MySqlCommand(sql, conn);
// conn.Open();
// cmd.ExecuteNonQuery();
// conn.Close();
//} catch (Exception e) {
// Console.WriteLine(e.ToString());
//}
#
endregion
Run
();
}
/* 메인 동작 함수 */
public
static
void
Run
()
{
// Repository 폴더들이 있는 주소를 지정하면 하위 폴더 목록을 가져옴(Repository 목록)
Regex
.
CacheSize
=
50
;
// var fields = VulnWorker.GetCriticalVariant(@"return _is_safe_url(url, host) and _is_safe_url(url.replace('\\', '/'), host)");
// return;
/* C:\VulnC에 있는 Git Repository들로 돌아감 */
var
directorys
=
Directory
.
GetDirectories
(
@"c:\VulnC"
);
if
(
directorys
.
Length
==
0
)
{
Console
.
WriteLine
(
"Repository 목록 찾기 실패"
);
...
...
@@ -98,16 +78,15 @@ namespace VulnCrawler
}
// Repository 목록 만큼 반복함.
foreach
(
var
directory
in
directorys
)
{
/
/ 템플릿 패턴화 T : VulnAbstractCrawler
if
(
directory
.
Contains
(
"
open
"
))
/
* 폴더 중에 linux가 있으면 잠깐 넘어감 (너무 커서 테스트 힘듦) */
if
(
directory
.
Contains
(
"
linux
"
))
{
continue
;
}
Console
.
WriteLine
(
directory
);
// 템플릿 패턴화 T : VulnAbstractCrawler
VulnWorker
.
Run
<
VulnC
>(
directory
);
}
}
#
region
Secure
string
input
static
String
SecureStringToString
(
SecureString
value
)
{
IntPtr
valuePtr
=
IntPtr
.
Zero
;
...
...
Vulnerablity_DB/VulnCrawler/VulnC.cs
View file @
92349a8
...
...
@@ -10,14 +10,27 @@ namespace VulnCrawler
{
public
class
VulnC
:
VulnAbstractCrawler
{
// protected override string RegexFuncPattern => $@"@@ \-(?<{OldStart}>\d+),(?<{OldLines}>\d+) \+(?<{NewStart}>\d+),(?<{NewLines}>\d+) @@ (?<{MethodName}>(static)?( const )? [\w]+ [\w]+\([\w \*\,\t\n]*[\)\,])";
// protected override string RegexFuncPattern => $@"@@ \-(?<{OldStart}>\d+),(?<{OldLines}>\d+) \+(?<{NewStart}>\d+),(?<{NewLines}>\d+) @@ (?<{MethodName}>(static)?( const )? [\w]+ [\w]+\([\w \*\,\t\n]*[\)\,])";
/* 함수 패턴 정규식 */
protected
override
string
RegexFuncPattern
=>
$
@"(?<{MethodName}>(unsigned|static)?( const )? [\w]+ [\w]+\(([\w \*\,\t\n])*[\)\,])"
;
/* 검색 파일 타입 */
protected
override
string
Extension
=>
".c"
;
/* 예약어 파일명 */
protected
override
string
ReservedFileName
=>
"CReserved.txt"
;
/// <summary>
/// 패치 코드에서 함수 목록 뽑는 정규식
/// </summary>
/// <param name="patchCode">패치 코드</param>
/// <returns></returns>
public
override
MatchCollection
GetMatches
(
string
patchCode
)
{
var
regs
=
Regex
.
Matches
(
patchCode
,
RegexFuncPattern
);
return
regs
;
}
/// <summary>
/// 주석 제거 함수 (안쓰임)
/// </summary>
/// <param name="original"></param>
/// <returns></returns>
public
override
string
RemoveComment
(
string
original
)
{
string
txt
=
Regex
.
Replace
(
original
,
Environment
.
NewLine
,
""
);
...
...
@@ -32,6 +45,11 @@ namespace VulnCrawler
return
replace
;
}
/// <summary>
/// 패치 정보에서 크리티컬 메서드 테이블 구함
/// </summary>
/// <param name="srcCode">원본 소스 코드</param>
/// <returns>키 = 크리티컬 메서드명, 값 = 크리티컬 변수 목록</returns>
public
override
IDictionary
<
string
,
IEnumerable
<
string
>>
ExtractGitCriticalMethodTable
(
string
srcCode
)
{
var
table
=
new
Dictionary
<
string
,
IEnumerable
<
string
>>();
...
...
@@ -105,6 +123,12 @@ namespace VulnCrawler
}
return
table
;
}
/// <summary>
/// 원본 함수 코드 구해주는 함수
/// </summary>
/// <param name="oldStream">원본 코드 파일</param>
/// <param name="methodName">찾을 메서드 이름</param>
/// <returns></returns>
protected
override
string
GetOriginalFunc
(
Stream
oldStream
,
string
methodName
)
{
StringBuilder
oldBuilder
=
new
StringBuilder
();
string
method
=
Regex
.
Escape
(
methodName
);
...
...
@@ -244,6 +268,12 @@ namespace VulnCrawler
return
oldBuilder
.
ToString
();
}
/// <summary>
/// 크리티컬 블록 리스트 구하는 함수
/// </summary>
/// <param name="srcCode">원본 함수 코드</param>
/// <param name="criticalList">크리티컬 변수 목록</param>
/// <returns></returns>
protected
override
IList
<
Block
>
GetCriticalBlocks
(
string
srcCode
,
IEnumerable
<
string
>
criticalList
)
{
...
...
@@ -471,6 +501,13 @@ namespace VulnCrawler
return
blockList
;
}
/// <summary>
/// 추상화 정규화 함수
/// </summary>
/// <param name="blockCode">블록 소스 코드</param>
/// <param name="dict">추상화 변환 변수 테이블</param>
/// <param name="methodDict">추상화 변환 메서드 테이블</param>
/// <returns></returns>
public
override
string
Abstract
(
string
blockCode
,
IDictionary
<
string
,
string
>
dict
,
IDictionary
<
string
,
string
>
methodDict
)
{
var
split
=
blockCode
.
Split
(
'\n'
);
...
...
Vulnerablity_DB/VulnCrawler/VulnWorker.cs
View file @
92349a8
...
...
@@ -16,7 +16,9 @@ namespace VulnCrawler
// 템플릿 메서드 패턴
public
static
void
Run
<
T
>(
string
dirPath
)
where
T
:
VulnAbstractCrawler
,
new
()
{
var
crawler
=
new
T
();
/* Git 경로로 초기화 */
crawler
.
Init
(
dirPath
);
/* 초기화된 커밋 목록 가져옴 */
var
commits
=
crawler
.
Commits
;
foreach
(
var
commit
in
commits
)
{
// 커밋 메시지
...
...
@@ -31,17 +33,15 @@ namespace VulnCrawler
// 패치 엔트리 파일 배열 중에 파일 확장자가 .py인 것만 가져옴
// (실질적인 코드 변경 커밋만 보기 위해서)
var
entrys
=
crawler
.
GetPatchEntryChanges
(
patch
);
/* C:\VulnC\linux 라면 linux만 뽑아서 repoName에 저장 */
var
dsp
=
dirPath
.
Split
(
Path
.
DirectorySeparatorChar
);
string
repoName
=
dsp
[
dsp
.
Length
-
1
];
// 현재 커밋에 대한 패치 엔트리 배열을 출력함
PrintPatchEntrys
(
entrys
,
crawler
,
message
,
cve
,
repoName
);
Console
.
ReadLine
();
}
// Console.ReadLine();
}
}
private
static
void
PrintPatchEntrys
(
IEnumerable
<
PatchEntryChanges
>
entrys
,
VulnAbstractCrawler
self
,
string
commitMsg
,
string
cve
,
string
repoName
)
{
foreach
(
var
entry
in
entrys
)
{
...
...
@@ -72,10 +72,6 @@ namespace VulnCrawler
Console
.
WriteLine
(
$
"Old Content: \n{oldContent}"
);
Console
.
ResetColor
();
//Console.BackgroundColor = ConsoleColor.DarkMagenta;
//Console.WriteLine($"New Content: \n{newContent}");
//Console.ResetColor();
Console
.
ForegroundColor
=
ConsoleColor
.
Blue
;
Console
.
WriteLine
(
$
"status: {entry.Status.ToString()}"
);
Console
.
WriteLine
(
$
"added: {entry.LinesAdded.ToString()}, deleted: {entry.LinesDeleted.ToString()}"
);
...
...
@@ -94,15 +90,26 @@ namespace VulnCrawler
Console
.
BackgroundColor
=
ConsoleColor
.
DarkRed
;
Console
.
WriteLine
(
$
"Patched: \n{entry.Patch}"
);
Console
.
ResetColor
();
/* 패치된 코드들에서 Method로 나누고 크리티컬 변수로 뽑아옴 Dictionary 구조 (키 = 함수명) */
var
table
=
self
.
ExtractGitCriticalMethodTable
(
entry
.
Patch
);
/* 크리티컬 메서드 테이블과 패치 전 파일에서 Process 하고 tuple로 가져옴 */
foreach
(
var
tuple
in
self
.
Process
(
oldBlob
,
table
))
{
/* 메서드 이름, 원본 함수 코드, 블록 리스트(크리티컬 포함) */
(
var
methodName
,
var
oriFunc
,
var
blocks
)
=
tuple
;
Console
.
BackgroundColor
=
ConsoleColor
.
DarkRed
;
Console
.
WriteLine
(
$
"메서드 이름 : {methodName}"
);
Console
.
ResetColor
();
foreach
(
var
block
in
blocks
)
{
/* 크리티컬 블록이 아니면 볼 필요 없으니 넘어감 */
if
(!
block
.
HasCritical
)
{
// Console.WriteLine("크리티컬 아님");
continue
;
}
if
(
block
.
HasCritical
)
{
Console
.
BackgroundColor
=
ConsoleColor
.
DarkMagenta
;
...
...
@@ -111,22 +118,19 @@ namespace VulnCrawler
{
Console
.
BackgroundColor
=
ConsoleColor
.
DarkGreen
;
}
/* 블록 정보 출력(블록 번호, 블록 소스코드, 블록 추상화 코드, 블록 해쉬값) */
Console
.
WriteLine
(
$
"=====block({block.Num}, {block.HasCritical.ToString()})"
);
Console
.
WriteLine
(
block
.
Code
);
Console
.
ResetColor
();
Console
.
WriteLine
(
$
"AbsCode = \n{block.AbsCode}"
);
Console
.
WriteLine
(
$
"MD5 = {block.Hash}"
);
if
(!
block
.
HasCritical
)
{
// Console.WriteLine("크리티컬 아님");
continue
;
}
/* base64 인코딩(MySQL에 들어갈 수 없는 문자열이 있을 수 있으므로 인코딩) */
byte
[]
funcNameBytes
=
Encoding
.
Unicode
.
GetBytes
(
methodName
);
byte
[]
codeOriBeforeBytes
=
Encoding
.
Unicode
.
GetBytes
(
oriFunc
);
byte
[]
codeAbsBeforeBytes
=
Encoding
.
Unicode
.
GetBytes
(
block
.
AbsCode
);
/* VulnDB에 하나의 레코드로 들어가는 하나의 취약점 객체 */
VulnRDS
.
Vuln
vuln
=
new
VulnRDS
.
Vuln
()
{
Cve
=
cve
,
...
...
@@ -140,76 +144,22 @@ namespace VulnCrawler
BlockNum
=
block
.
Num
,
};
// Console.WriteLine("추가중...");
Console
.
WriteLine
(
$
"Vuln FuncName:{vuln.FuncName}"
);
/* VulnDB에 추가 */
VulnRDS
.
InsertVulnData
(
vuln
);
// Console.WriteLine($"추가: {vuln.Cve}, {vuln.FuncName}, {vuln.RepositName}");
// Console.ReadLine();
}
}
//foreach (var item in table)
//{
// Console.WriteLine($"Method : {item.Key}");
// //foreach (var b in item.Value)
// //{
// // Console.WriteLine($"--{b}");
// //}
//}
// Console.ReadLine();
}
else
{
continue
;
}
// 패치 코드에서 매칭된 파이썬 함수들로부터
// 패치 전 코드 파일(oldBlob)을 탐색하여 원본 파이썬 함수 가져오고(originalFunc)
//
#
endregion
//foreach (var reg in regs)
//{
// var match = reg as Match;
// string methodName = match.Groups[VulnAbstractCrawler.MethodName].Value.Trim();
// string originalFunc, md5;
// (originalFunc, md5) = self.Process(oldBlob.GetContentStream(),
// methodName);
// #region 현재 패치 엔트리 정보 출력(추가된 줄 수, 삭제된 줄 수, 패치 이전 경로, 패치 후 경로)
// // 패치 전 원본 함수
// Console.WriteLine($"Original Func: {originalFunc}");
// // 해쉬 후
// Console.WriteLine($"Original Func MD5: {md5}");
// //Console.BackgroundColor = ConsoleColor.DarkRed;
// //Console.WriteLine($"Patched: \n{entry.Patch}");
// Console.ResetColor();
// Console.ForegroundColor = ConsoleColor.Red;
// Console.WriteLine("==============================");
// Console.ResetColor();
// #endregion
//}
//Console.ReadLine();
}
catch
(
Exception
e
)
{
// Console.WriteLine(entry.Patch);
// Console.WriteLine(e.ToString());
// Console.ReadLine();
continue
;
}
...
...
Please
register
or
login
to post a comment