[Python] Whoosh 검색 엔진을 이용하여 CVE 검색하기 Develop Tip

CVE (Common Vulnerabilities and Exposures) 라는 것이 있습니다.

우리의 컴퓨팅 세상에는 조물주가 아니라 인간이 만든 환경이기 때문에
수없이 많은 보안 취약점 및 구멍이 존재합니다.

이런 취약점을 누군가가 통합 관리하지 않는다면 벤더별, 프로그램별, 버전별
흐아... 또는 취약점을 잘못 알려줬다면 오탐이 발생하는 등...

다행히 MITRE 라는 조직에서 이런 역할을 자청하여 해 주고 있습니다.

여담이지만 2005년 정도에 OSVDB.org 라는 사이트가 있어,
서너 가지 이상의 각 취약점 목록을 모두 모아 중앙에서 별도 관리를 하고
Download 받을 수 있는 상위 메타 취약점 DB를 관리하는 조직이 있었습니다.

대충 읽어보니 재정 지원이 어려워 개인적인 작업으로는 한계가 있어 종료한다고 나옵니다.

오픈소스도 마찬가지이지만 이렇게 재정지원이 제대로 안되어 종료되는 프로젝트를
보니 한편으로 씁쓸합니다.

암튼 위와 같이 CVE가 여러 다양한 방법으로 다운로드 할 수 있습니다.

CVRF, XML, HTML, TXT 등등의 형식이 있는데, 확인해 본 바로는
TXT가 가장 파싱하기에 쉬워 보입니다.

자... 간단히 확인을 해 보면,

======================================================
Name: CVE-1999-0033
Status: Candidate
URL: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-1999-0033
Phase: Modified (20040811)
Category: SF
Reference: CERT:CA-97.18.at
Reference: SUN:00160
Reference: XF:sun-atbo

Command execution in Sun systems via buffer overflow in the at
program.
...

와 같은 것이 반복되어 나옵니다.

======================================================
로 하나의 CVE가 시작합니다.

name은 CVE-nnnn-nnnn 과 같은 코유 ID로 꼭 나오 고,
Status 는 현재 CVE의 상태이고,
URL은 해당 취약점을 나타내는 URL이고,
Phase는 갱신 상태,
Category는 카테고리,
Reference는 참조내용인데 여러줄이 나올 수 있습니다.
(아마 Name을 제외한 다른 것은 제외될 수 있습니다)

공백줄이 나오고 나서 다음 CVE가 시작되지 전 까지가 해당 내용 (body)입니다.

그런데 문제는 body 부분이 일반 영문 설명이기 때문에 이것을 검색하는 것은
검색엔진을 이용해야 합니다.

전에 [Python] 검색엔진 Whoosh를 확인해 본 적이 있는데, 이를 활용해 보겠습니다.

우선 index.py 를 이용하여 "http://cve.mitre.org/data/downloads/allitems.txt" 에서 스트림으로 읽으면서
특정위치 (/opt/scap/cve) 에 Full Text 검색을 위한 색인을 합니다.

대충 제 맥북에서 2분 조금 더 걸립니다. CVE 개수는 이 글을 쓰는 현재 102,000여개 정도 입니다.

그리고 search.py 를 이용하여 검색할 수 있습니다.

위와 같이 검색을 해 볼 수 있습니다.

예를 들어,

$ python search.py -o 3 -l 2  cisco ios 3.8
[1]================================================================================
{'body': u'Cisco IOS 12.2 and 15.0 through 15.3 and IOS XE 3.2 through 3.7 before\n3.7.5S and 3.8 through 3.10 before 3.10.1S allow remote attackers to\ncause a denial of service (device reload) via a malformed IKEv2\npacket, aka Bug ID CSCui88426.\nCurrent Votes:\nNone (candidate not yet proposed)',
 'category': u'',
 'n_length': 10,
 'n_order': 1,
 'name': u'CVE-2014-2108',
 'phase': u'Assigned (20140225)',
 'reference': u'CISCO:20140326 Cisco IOS Software Internet Key Exchange Version 2 Denial of Service Vulnerability\nURL:http://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20140326-ikev2',
 'status': u'Candidate',
 'url': u'http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-2108'}
[2]================================================================================
{'body': u'Memory leak in the Smart Install client implementation in Cisco IOS\n12.2 and 15.0 through 15.2 and IOS XE 3.2 through 3.8 allows remote\nattackers to cause a denial of service (memory consumption) via\ncrafted image-list parameters, aka Bug ID CSCuy82367.\nCurrent Votes:\nNone (candidate not yet proposed)',
 'category': u'',
 'n_length': 10,
 'n_order': 2,
 'name': u'CVE-2016-6385',
 'phase': u'Assigned (20160726)',
 'reference': u'MISC:https://ics-cert.us-cert.gov/advisories/ICSA-16-287-04\nCISCO:20160928 Cisco IOS and IOS XE Software Smart Install Memory Leak Vulnerability\nURL:http://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20160928-smi\nBID:93203\nURL:http://www.securityfocus.com/bid/93203',
 'status': u'Candidate',
 'url': u'http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6385'}

라고 "cisco ios 3.8" 이라는 내용이 들어있는 CVE body 중에 네번째 부터 2개만 출력하라는 것입니다.
(총 결과는 10개 입니다)


어느 분께는 도움이 되셨기를....



덧글

댓글 입력 영역

구글애드텍스트