KR20090033228A - 데이터 흐름 보전의 실시에 의한 소프트웨어 보호 방법 - Google Patents
데이터 흐름 보전의 실시에 의한 소프트웨어 보호 방법 Download PDFInfo
- Publication number
- KR20090033228A KR20090033228A KR1020097000952A KR20097000952A KR20090033228A KR 20090033228 A KR20090033228 A KR 20090033228A KR 1020097000952 A KR1020097000952 A KR 1020097000952A KR 20097000952 A KR20097000952 A KR 20097000952A KR 20090033228 A KR20090033228 A KR 20090033228A
- Authority
- KR
- South Korea
- Prior art keywords
- data flow
- instructions
- static analysis
- software
- software program
- Prior art date
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/54—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/08—Error detection or correction by redundancy in data representation, e.g. by using checking codes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F5/00—Methods or arrangements for data conversion without changing the order or content of the data handled
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
대다수의 소프트웨어 공격들은 소프트웨어 취약성 또는 결함을 이용하여, 의도하지 않은 장소에 데이터를 기입한다. 예를 들어, 제어 데이터 공격들은 버퍼 오버플로우 또는 다른 취약성을 이용하여, 스택 내의 리턴 어드레스, 함수 포인터 또는 소정의 다른 제어 데이터를 덮어쓴다. 비제어 데이터 공격들은 유사한 취약성을 이용하여, 프로그램 내의 의도된 제어 흐름을 파괴하지 않고 보안 중요 데이터를 덮어쓴다. 본 발명은 제어 데이터 및 비제어 데이터 공격들 양자에 대해 소프트웨어를 보호하기 위한 방법을 설명한다. 소프트웨어 프로그램에 대한 데이터 흐름 정보를 결정하기 위해 정적 분석이 수행된다. 소프트웨어의 실행 또는 에뮬레이션 동안 데이터 흐름을 추적하기 위해 데이터 흐름 추적 명령들이 형성된다. 또한, 정적 분석 결과들에 대해 추적된 데이터 흐름을 체크하여 잠재적 공격들 또는 에러들을 식별하기 위해 체크 명령들이 형성된다. 결과적인 추가 오버헤드들을 줄이기 위한 최적화들이 옵션으로서 설명된다.
컴퓨터 시스템, 소프트웨어 보호, 데이터 흐름 보전, 제어 데이터 공격, 비제어 데이터 공격
Description
본 발명은 일반적으로 컴퓨터 프로그래밍의 분야에 관한 것이다. 구체적으로, 본 발명은 컴퓨터 애플리케이션 또는 시스템 컴포넌트에 대한 공격의 방어에 관한 것으로서, 데이터 흐름 보전의 실시에 의한 소프트웨어 보호와 특히 관련되지만, 이에 제한되지 않는다. 또한, 본 발명은 프로그래밍 에러들이 공격에 이용되지 않는 경우에도 그러한 프로그래밍 에러들을 발견함으로써 소프트웨어를 보다 신뢰성 있게 하는 것에 관한 것이다.
대부분의 소프트웨어는 버퍼 오버플로우, 포맷 스트링 취약성 및 다른 취약성이 가능하고 공격자들에 의해 이용될 수 있어서 보안 또는 프라이버시 침해가 가능한 C 및 C++과 같은 안전하지 않은 언어들로 작성된다. 타입 안전(type-safe) 언어들로 작성된 프로그램들조차도 안전하지 않은 언어들로 작성된 라이브러리들 및 실행 시간들을 갖는다. 따라서, 현재의 소프트웨어는 다양한 공격에 취약하며, 예상 가능한 미래에 취약하게 유지될 가능성이 있다.
대다수의 소프트웨어 공격들은 소프트웨어 취약성 또는 결함을 이용하여, 의도하지 않은 장소에 데이터를 기입한다. 예를 들어, 제어 데이터 공격들은 버퍼 오버플로우 또는 다른 취약성을 이용하여, 스택 내의 리턴 어드레스, 함수 포인터 또는 소정의 다른 제어 데이터를 덮어쓴다. 비제어 데이터 공격들은 유사한 취약성을 이용하여, 프로그램 내의 의도된 제어 흐름을 파괴하지 않고 보안 중요 데이터를 덮어쓴다. 비제어 데이터 공격들은 제어 데이터 공격들보다 덜 빈번한 것으로 생각되지만, 이들은 똑같이 심각하며, 현재 이들에 대한 좋은 방어가 알려져 있지 않다.
이전에, 소프트웨어 공격들을 방지하는 C의 메모리 안전 방언(dialect)들을 사용하는 것이 제안되었다. 그러나, 이러한 접근법들은 기존 C 코드가 이러한 방언들로 포팅되는 것을 필요로 하는데, 이는 간단하지 않은 작업이며, C 실행 시간에 중대한 변경이 발생한다.
다른 공지된 접근법들이 기존 프로그램들에 적용될 수 있지만, 이들은 통상적으로 비제어 데이터 공격들을 방어할 수 없고, 그리고/또는 거짓 양성(false positives)을 가지며, 하드웨어 지원이 없을 경우 매우 큰 오버헤드를 유발할 수 있다.
<발명의 요약>
이하는 독자에게 기본적인 이해를 제공하기 위해 본 발명의 간단한 요약을 제공한다. 이 요약은 본 발명의 포괄적인 개요는 아니며, 본 발명의 중요한/결정적인 요소들을 식별하거나 본 발명의 범위를 정의하지 않는다. 그의 유일한 목적은 나중에 제공되는 보다 상세한 설명에 대한 서론으로서 간단한 형태로 여기에 개시되는 소정 개념들을 제공하는 것이다.
대다수의 소프트웨어 공격들은 소프트웨어 취약성 또는 결함을 이용하여, 의도하지 않은 장소에 데이터를 기입한다. 예를 들어, 제어 데이터 공격들은 버퍼 오버플로우 또는 다른 취약성을 이용하여, 스택 내의 리턴 어드레스, 함수 포인터 또는 소정의 다른 제어 데이터를 덮어쓴다. 비제어 데이터 공격들은 유사한 취약성을 이용하여, 프로그램 내의 의도된 제어 흐름을 파괴하지 않고 보안 중요 데이터를 덮어쓴다. 본 발명은 제어 데이터 및 비제어 데이터 공격들 양자에 대해 소프트웨어를 보호하기 위한 방법을 설명한다. 소프트웨어 프로그램에 대한 데이터 흐름 정보를 결정하기 위해 정적 분석이 수행된다. 소프트웨어의 실행 또는 에뮬레이션 동안 데이터 흐름을 추적하기 위해 데이터 흐름 추적 명령들이 형성된다. 또한, 정적 분석 결과들에 대해 추적된 데이터 흐름을 체크하여 잠재적 공격들 또는 에러들을 식별하기 위해 체크 명령들이 형성된다. 결과적인 추가 오버헤드들을 줄이기 위한 최적화들이 옵션으로서 설명된다.
본 예는
- 소프트웨어 프로그램의 정적 분석의 결과들에 대한 액세스를 제공하는 단계 - 상기 정적 분석 결과들은 데이터 흐름 정보를 포함함 - ;
- 상기 소프트웨어 내의 데이터 흐름을 추적하기 위해 데이터 흐름 추적 명령들을 형성하는 단계; 및
- 상기 정적 분석 결과들에 대해 상기 추적된 데이터 흐름을 체크하여 상기 소프트웨어 프로그램 내의 잠재적 결함들을 식별하기 위해 체크 명령들을 형성하는 단계
를 포함하는 방법을 제공한다.
이러한 방식으로 데이터 흐름 보전을 실시함으로써, 본 발명은 제어 데이터 공격들 및 비제어 데이터 공격들 양자를 검출할 수 있다. 이와 달리, 제어 흐름 보전을 실시하려고 시도하는 공지 방법들은 제어 데이터 공격들만을 방어할 수 있다. "소프트웨어 프로그램 내의 결함"이라는 용어는 소프트웨어 프로그램에 대한 잠재적 공격들 및/또는 소프트웨어 프로그램 내의 프로그래밍 에러들을 지칭하는 데 사용된다.
- 소프트웨어 프로그램의 정적 분석의 결과들에 액세스하는 입력 - 상기 정적 분석 결과들은 데이터 흐름 정보를 포함함 - ;
- 상기 소프트웨어 내의 데이터 흐름을 추적하기 위해 데이터 흐름 추적 명령들을 형성하는 프로세서; 및
- 상기 정적 분석 결과들에 대해 상기 추적된 데이터 흐름을 체크하여 상기 소프트웨어 프로그램 내의 잠재적 결함들을 식별하기 위해 체크 명령들을 형성하는 프로세서
를 포함하는 대응 장치가 제공된다.
다른 예에서, 본 발명은 데이터 흐름 보전을 실시하도록 구성된 소프트웨어 프로그램의 최종 사용자에 의해 수행되는 방법을 제공한다. 예를 들어, 이 방법은
- 소프트웨어 프로그램의 정적 분석의 결과들에 액세스하는 단계 - 상기 정적 분석 결과들은 데이터 흐름 정보를 포함함 - ;
- 상기 소프트웨어 프로그램의 실행 또는 에뮬레이션 동안 상기 소프트웨어 프로그램 내의 데이터 흐름을 추적하는 단계; 및
- 상기 정적 분석 결과들에 대해 상기 추적된 데이터 흐름을 체크하고, 불일치가 발견되는 경우에 지시를 행하는 단계
를 포함한다.
대응 장치가 제공된다.
이 장치는
- 소프트웨어 프로그램의 정적 분석의 결과들에 액세스하는 입력 - 상기 정적 분석 결과들은 데이터 흐름 정보를 포함함 - ;
- 상기 소프트웨어 프로그램의 실행 또는 에뮬레이션 동안 상기 소프트웨어 프로그램 내의 데이터 흐름을 추적하는 프로세서
를 포함하고,
- 상기 프로세서는 또한 상기 정적 분석 결과들에 대해 상기 추적된 데이터 흐름을 체크하고, 불일치가 발견되는 경우에 지시를 행한다.
바람직하게는, 상기 데이터 흐름 추적 명령들 및 상기 체크 명령들은 수정된 컴파일러 및 이진 재기입 도구 중 어느 하나를 이용하여 상기 소프트웨어에 추가된다. 다른 예에서, 상기 명령들은 상기 소프트웨어 프로그램을 실행하는 프로세서를 에뮬레이트하는 머신 에뮬레이터 및 상기 머신 에뮬레이터의 하드웨어 등가물 중 어느 하나를 이용하여 구현된다.
바람직하게는, 상기 잠재적 공격들은 제어 데이터 공격들 및 비제어 데이터 공격들 양자를 포함한다.
예를 들어, 상기 정적 분석 결과들은 상기 소프트웨어 프로그램 내의 명령에 의해 판독된 각각의 값에 대해 상기 값을 기입할 수 있는 상기 소프트웨어 프로그램으로부터의 명령들의 세트를 포함한다.
소정 실시예들에서, 상기 방법은 상기 소프트웨어 프로그램의 소스 코드로부터 도달 정의들을 계산함으로써 상기 소프트웨어 프로그램의 정적 분석을 수행하는 단계를 더 포함한다.
바람직하게는, 상기 데이터 흐름 추적 명령들은 식별자들과 메모리 위치들 간의 맵핑을 유지하고, 상기 식별자들은 상기 메모리 위치들 각각에 기입하기 위한 최종 명령의 식별자이다.
예를 들어, 상기 체크 명령들은 판독 명령들을 도구화(instrumentation)한다.
바람직하게는, 상기 판독 명령들은 판독되는 값을 기입한 명령의 식별자가 상기 정적 분석에 의해 계산된 관련 세트의 요소인지를 체크하도록 도구화된다.
일 실시예에서, 상기 방법은 명령들의 등가 클래스들을 결정하고, 동일 클래스 내의 모든 명령에 동일 식별자를 할당하는 단계를 더 포함한다.
일례에서, 상기 방법은 상기 데이터 흐름 추적 명령들의 일부 및 상기 체크 명령들의 일부를 제2 정적 분석에 기초하여 제거하는 단계를 포함한다.
일례는 컴퓨터 상에서 실행될 때, 전술한 방법들 중 어느 하나의 방법의 모든 단계를 수행하는 컴퓨터 프로그램 코드 수단을 포함하는 컴퓨터 프로그램을 제공한다. 예를 들어, 상기 컴퓨터 프로그램은 컴퓨터 판독가능 매체 상에 구현된 다.
장치 예들과 관련하여:
상기 장치는 예를 들어 상기 소프트웨어 프로그램의 소스 코드로부터 도달 정의들을 계산함으로써 상기 소프트웨어 프로그램의 정적 분석을 수행하는 컴파일러를 포함한다.
바람직하게는, 상기 프로세서는 식별자들과 메모리 위치들 간의 맵핑을 유지하기 위해 상기 데이터 흐름 추적 명령들을 형성하고, 상기 식별자들은 상기 메모리 위치들 각각에 기입하기 위한 최종 명령의 식별자이다.
바람직하게는, 상기 프로세서는 검사 명령들을 추가하여 이들이 판독 명령들을 도구화하게 한다.
바람직하게는, 상기 프로세서는 판독되는 값을 기입한 명령의 식별자가 상기 정적 분석에 의해 계산된 관련 세트의 요소인지를 체크하기 위해 각각의 판독 명령에 대한 체크 명령들을 형성한다.
상기 방법들은 저장 매체 상의 머신 판독가능 형태의 소프트웨어에 의해 수행될 수 있다. 소프트웨어는 병렬 프로세서 또는 직렬 프로세서 상에서의 실행에 적합할 수 있으며, 따라서 방법 단계들은 임의의 적절한 순서로 또는 동시에 수행될 수 있다.
이것은 소프트웨어가 귀중하고, 개별적으로 거래 가능한 상품일 수 있음을 확인시켜 준다. 원하는 기능들을 수행하기 위해 "덤(dumb)" 또는 표준 하드웨어 상에서 실행되거나 이를 제어하는 소프트웨어를 포함하는 것을 의도한다(따라서, 소프트웨어는 본질적으로 소프트웨어 보안 시스템의 기능들을 정의하며, 따라서 그의 표준 하드웨어와 결합되기 전에도 소프트웨어 보안 시스템으로 지칭될 수 있다). 유사한 이유로, 원하는 기능들을 수행하기 위해, 실리콘 칩들을 설계하거나 유니버설 프로그래머블 칩들을 구성하는 데 사용되는 바와 같은 HDL(하드웨어 기술 언어) 소프트웨어와 같이 하드웨어의 구성을 "기술"하거나 정의하는 소프트웨어를 포함하는 것을 의도한다. 불확실의 방지를 위해, 본 발명은 시스템의 임의 부분이 소프트웨어가 아니라 하드웨어로 구현되는 구현들을 포함한다.
많은 부수적인 특징들은 첨부 도면들과 관련하여 고려되는 아래의 상세한 설명을 참조하여 보다 양호하게 이해될 때 보다 쉽게 인식될 것이다.
본 설명은 첨부 도면들을 고려하여 읽는 아래의 상세한 설명으로부터 더 잘 이해될 것이다.
도 1은 컴퓨터에 의해 사용되는 메모리의 개략도이다.
도 1b는 스택의 일부의 개략도이다.
도 1c는 컴퓨터 메모리의 일부의 개략도이다.
도 2는 소프트웨어를 보호하는 방법의 흐름도이다.
도 3은 정적 분석 방법의 흐름도이다.
도 4는 맵핑 데이터 구조를 유지하고 소프트웨어 프로그램의 보전을 체크하는 방법의 흐름도이다.
도 5는 소프트웨어를 보호하기 위한 수정된 컴파일러의 개략도이다.
도 6은 소프트웨어를 보호하기 위한 이진 재기입 도구의 개략도이다.
도 7은 소프트웨어를 보호하기 위한 머신 에뮬레이터의 개략도이다.
도 8은 소프트웨어를 보호하기 위한 도 7의 머신 에뮬레이터를 이용하는 방법의 흐름도이다.
첨부 도면들에서는 동일 참조 번호들이 동일 부분들을 지시하는 데 사용된다.
첨부 도면들과 관련하여 아래에 제공되는 상세한 설명은 본 예들의 설명으로서 의도하며, 본 예가 구성되거나 이용될 수 있는 유일한 형태들을 나타내는 것을 의도하지 않는다. 본 설명은 본 예의 기능들 및 본 예를 구성하고 동작시키기 위한 단계들의 시퀀스를 설명한다. 그러나, 동일하거나 균등한 기능들 및 시퀀스들이 상이한 예들에 의해 달성될 수도 있다.
본 발명은 제어 데이터 공격들 및 비제어 데이터 공격들 양자에 대해 소프트웨어 프로그램들을 보호할 필요성을 인식한다. 본 발명은 데이터 흐름 보전을 실시함으로써 동작하는 이를 달성하기 위한 방법을 제공한다. 제어 데이터 공격들 및 비제어 데이터 공격들의 보다 나은 이해를 위해, 도 1, 1b 및 1c를 참조하여 일례가 설명된다.
도 1은 (컴퓨터 프로세서가 볼 때) 운영 체제 전용 메모리(1), 사용자 메모리(B) 및 가용 메모리(A)를 포함하는 컴퓨터 메모리의 일부의 개략도이다. 운영 체제 메모리(1)는 컴퓨터의 운영 체제에 의한 것 외의 어떠한 다른 사용도 가능하지 않다. 사용자 메모리는 예를 들어 사용자에 의해 설치된 소프트웨어 애플리케이션들에서 이용될 수 있는데, 도 1의 예에서 메모리의 소정 블록들은 이러한 목적으로 차지된다(블록들 C 참조). 가용 메모리(A)는 도 1의 아랫부분에 더 상세히 도시되어 있다. 이것은 화살표 방향으로 채워지는 스택(2) 및 힙(3)을 포함하며, 컴퓨터의 작업 메모리로서 간주할 수 있다. 컴퓨터 메모리는 정보의 항목들이 고유 어드레스 또는 식별자를 각각 갖는 메모리 위치들에 저장되는 "피젼 홀" 메모리 모델을 개략적으로 이용하는 것으로 간주할 수 있다. 예를 들어, 도 1c는 그러한 피젼 홀들의 2개의 행을 도시한다.
이제, 컴퓨터 프로그래밍 언어 C로 작성되고 아래에 주어지는 예시적인 코드 단편을 고려한다.
이것은 1번 내지 12번의 12개 코드 라인을 포함한다. 라인 1에서, 정수 변수가 정의되고 0의 값으로 설정된다. 라인 2에서, packet이라고 하는 문자 값들의 1000 바이트 어레이가 설정되고, 1000 바이트의 메모리가 이 어레이에 의한 사용을 위해 할당된다. 이어서, 라인 4에서 while 루프가 시작되어 라인 9까지 계속된다. while 루프는 변수 authenticated의 값이 0인 것을 조건으로 한다. 이 시점에서, authenticated의 값은 라인 1에서 0으로 설정되었던 바로 그 0이다. 이어서, 본 발명은 라인 5로 진행하여, 독립 변수 packet에 대해 함수 PacketRead를 수행한다. 이 함수는 하나의 패킷을 라인 2에서 이미 정의된 어레이 packet 내로 판독한다. 라인 7에서, 본 발명은 함수 Authenticate를 호출하여, 판독된 패킷을 체크하고, 결과가 성공적인 경우, 변수 authenticated의 값을 1로 설정한다(라인 8 참조). 이어서, 라인 11 및 12에서, 본 발명은 함수 ProcessPacket을 이용하여, 인증된 패킷을 처리한다. 그러나, C 및 C++과 같은 많은 컴퓨터 언어에서 그러하듯이, 함수 PacketRead는 1000 바이트보다 많은 바이트를 packet에 기입할 수 있는 것으로 추정한다. 이러한 취약성은 함수 PacketRead의 리턴 어드레스를 덮어쓰거나 authenticated를 덮어쓰는 데 이용될 수 있다. 이것은 이제 도 1 및 1b를 참조하여 설명된다. 위의 12개 코드 라인을 포함하는 소프트웨어 애플리케이션이 도 1의 사용자 메모리(B)에 저장되고, 예를 들어 함수 PacketRead를 호출하는 라인 5가 D에 저장되는 것으로 가정한다. 이 라인은 예를 들어 E에 저장되어 있는 함수 PacketRead를 호출한다. E에서 PacketRead를 호출한 결과로서, 하나의 패킷이 판독되고, 스택 상에 예를 들어 도 1b의 4에 저장되는데, 스택 상의 5에는 변수 authenticated의 값이 미리 저장되어 있고, 스택 상의 6에는 리턴 어드레스(PacketRead를 호출하였고 제어 흐름이 반환될 명령인 D의 어드레스)에 대한 값 R이 저장되어 있다. 판독된 패킷이 1000 바이트보다 큰 경우, 이것은 도 1b의 메모리 위치들 5 및 6을 덮어쓸 수 있다. 리턴 어드레스(R)를 덮어씀으로써, 공격자는 프로그램이 라인 5로 돌아가서 프로그램을 계속하는 것을 방해할 수 있다. 공격자는 프로그램의 제어 흐름을 메모리의 다른 부분들로 전환할 수 있으며, 따라서 보안 및/또는 프라이버시를 파괴할 수 있다. 이것은 공격자가 실행에 대한 제어를 얻는 것을 가능하게 할 수 있는 제어 데이터 공격의 형태이다. 변수 authenticated의 값을 덮어씀으로써, 공격자는 while 루프가 인증이 성공할 때까지 반복하는 대신에 반복을 중지하게 할 수 있다. 이어서, 공격자는 적절한 인증 없이 그의 패킷이 처리되게 할 수 있다. 이것은 비제어 데이터 공격의 형태이다.
전술한 바와 같이, 본 발명의 접근법은 데이터 흐름 보전의 실시를 포함한다. 하이 레벨에서, 본 발명의 방법은 사전 계산된 정적 데이터 흐름을 계산 또는 액세스하는 단계(도 2의 박스 10 참조), 및 동적 데이터 흐름을 추적하고 그 동적 데이터 흐름의 보전을 체크하기 위한 프로그램을 도구화하기 위하여(프로그램에 명령들을 추가하기 위하여) 프로그램 도구화 프로세스를 실행하는 단계(도 2의 박스 12 참조)를 포함한다. 도구화는 동적 데이터 흐름을 추적하기 위한 데이터 흐름 추적 명령들의 추가를 포함한다. 이것은 또한 정적 데이터 흐름 정보에 대해 동적 데이터 흐름을 체크하기 위한 체크 명령들의 추가를 포함한다. 이어서, 도구화된 프로그램은 실행될 수 있고, 데이터 흐름 보전이 위반된 경우에는 예외를 발생시키거나, 경고하거나, 작업을 중지할 것이다.
정적 분석은 주어진 소프트웨어 프로그램에 대한 데이터 흐름 정보의 결정을 포함한다. 예를 들어, 각각의 프로그램 위치(위의 코드 예의 라인 번호 등)에 대해, 정적 분석은 관련 프로그램 위치에 값을 기입할 수 있는 한 세트의 프로그램 위치들을 계산한다. 따라서, 예를 들어, 프로그램 위치 라인 4는 변수 authenticated를 포함한다. 이 변수는 라인 1 또는 라인 8에 기입되었을 수 있다. 따라서, 라인 4에 대한 정적 분석 결과들은 세트 {1,8}을 포함하고, 라인 11에 대한 정적 분석 결과들도 {1,8}을 포함한다. 간단한 예에서, 완전한 정적 분석 결과들을 제공하기 위해, 이러한 방식으로 각각의 라인 번호에 대한 프로그램 위치들의 세트들이 생성된다. 보다 일반적으로, 정적 분석은 명령에 의해 판독된 각각의 값에 대해 그 값을 기입할 수 있는 명령들의 세트를 계산한다. 후술하는 바와 같이, 정적 분석 결과 세트들은 특정 예에서 소스 코드 라인 번호들이 아니라 컴파일러의 프로그램의 중간 표현 내의 명령들과 연관된다. 소스 코드 라인 번호들은 위에서 명료화를 위해 참조된다.
이러한 값들의 세트들을 계산하는 임의의 적절한 방법이 사용될 수 있다. 예를 들어, Aho, Sethi and Ullman "Compilers: Principles, Techniques and Tools" 1986 Addison Wesley ISBN 0-201-10194-7에 의해 기술된 바와 같은 도달 정의 분석이 이용될 수 있다. Aho 등에 의해 기술된 바와 같은 도달 정의 분석은 다음과 같다. 메모리 위치에 기입하는 명령이 메모리 위치 내의 값을 정의하고, 메모리 위치로부터 값을 판독하는 명령이 값을 사용한다. 분석은 각각의 사용에 대해 도달 정의들의 세트를 계산한다. 이것은 각각의 정의에 식별자를 할당하고, 각각의 사용에 대해 도달 정의 식별자들의 세트를 리턴한다.
예를 들어, authenticated는 라인 4 및 11에서 사용된다. 소스 코드에서 도달 정의 분석을 실행하는 경우, 분석은 라인 1 및 8 내의 정의들이 양쪽 사용에 도달한 것으로 결정할 수 있다. 따라서, 양쪽 사용에 대한 도달 정의 식별자들의 세트는 정의들을 식별하기 위해 라인 번호들을 사용한 경우 {1,8}일 것이다.
분석은 부정확할 수 있지만, 보존적인 것이 중요하다. 분석은 실행 시간에 사용에 도달할 수 있는 모든 정의를 세트 내에 포함해야 하지만, 추가 정의들을 포함할 수도 있다. 예를 들어, 라인 8의 정의만이 라인 11에서의 사용에 도달할 수 있지만, 분석은 도달 정의들의 세트 {1,8}를 계산할 수 있다. 이것은 데이터 흐름 보전 실시가 거짓 양성을 갖지 않는 것을 보장하기 위해 중요하다.
전술한 바와 같이, 보호될 프로그램은 데이터 흐름을 추적하고 추적된 데이터 흐름이 정적 분석 결과들과 함께 컴파일됨을 체크하도록 (예를 들어, 명령들을 추가함으로써) 도구화된다. 본 명세서에서 도구화로 참조되는, 명령들을 추가하는 프로세스는 수정된 컴파일러, 바이너리 재기입 도구, 머신 에뮬레이터, 전용 하드웨어 중 어느 하나를 이용하여 또는 임의의 다른 적절한 방법으로 달성된다. 즉, 프로그램은 실행 시간에 각각의 판독에 도달하는 정의를 계산하고, 이 정의가 정적으로 계산된 도달 정의 식별자들의 세트 내에 있는지를 체크하도록 도구화된다. 실행 시간에 도달 정의들을 계산하기 위하여, 각각의 메모리 위치에 기입하기 위한 최종 명령의 식별자를 기록하는 실행 시간 정의 테이블(RDT)을 유지한다. 모든 기입은 RDT를 갱신하도록 도구화된다. 판독 전에 도구는 RDT로부터 식별자를 검색하기 위해 판독되고 있는 메모리 위치의 어드레스를 사용한다. 이어서, 도구는 이 식별자가 정적으로 계산된 세트 내에 있는지를 체크한다. 예를 들어, 위의 C 코드 단편 예에서는, 라인 8에서 RDT[&authenticated]를 8로 설정하고, 라인 4 및 11에서 RDT[&authenticated]∈{1,8}인지를 체크하기 위한 코드를 추가할 것이다.
이것은 이제 도 1c를 참조하여 개략적으로 설명된다. 위의 예시적인 프로그램의 라인 8에 도달하고, 변수 authenticated의 값이 1로 설정되는 것으로 가정한다. 이것은 하나의 값을 메모리에 기입하여 변수의 값을 나타내는 것을 포함한다. 예를 들어, 도 1c에 지시되는 바와 같이, 메모리 위치(101)에 X가 기입된다. 도 1c의 피젼 홀 메모리의 아래 행에 지시되는 관련 메모리가 형성되는 것으로 가정한다. 메모리 위치(101)와 연관된 메모리 위치(102)에, 변수 authenticated에 기입하는 명령이 발생한 프로그램 위치 라인 8에 대한 정보를 저장한다. 관련 메모리에 저장된 이 정보는 데이터 흐름 추적 정보의 일례이다. 관련 메모리에 이러한 정보를 저장하기 위해, 데이터 흐름 추적 명령들이 예시적인 프로그램에 추가된다.
이후, 프로그램의 실행에서 라인 11에 도달한다. 이 라인에서, authenticated의 값을 판독하기 위한 명령이 주어진다. 이러한 판독을 행하기 전에, 관련 메모리 내의 메모리 위치(102)의 엔트리가 정적 데이터 흐름 정보와 일치하는 것에 대한 체크가 행해진다. 이러한 체크는 프로그램에 추가된 체크 명령들을 이용하여 행해진다. 전술한 바와 같이, 정적 데이터 흐름 정보는 각각의 프로그램 위치(예를 들어, 라인)에 대해 현재 라인의 값이 기입되었을 수 있는 라인 번호들의 세트를 포함한다. 라인 11의 경우, 도 1c에 지시된 바와 같이 값들의 세트는 {1,8}이다. 이러한 라인 번호들(1, 8)은 후술하는 도달 정의 식별자들의 예이다. (메모리 위치(101)에 대응하는) 메모리 위치(102) 내의 엔트리는 이 세트의 멤버인 값을 포함하므로, 이 경우에는 어떠한 지시도 행해질 필요가 없다. 그러나, 전술한 바와 같이, 공격이 발생한 경우에는, 변수 authenticated의 값 및 PackekRead의 리턴 어드레스가 (예를 들어) 덮어 쓰였을 수 있다.
이 경우, 관련 메모리 위치(102) 내의 값은 도 1c에서와 같은 8이 아니라 z이다. 이것은 변수 authenticated가 덮어 쓰일 때 라인 z에서 PacketRead 함수가 메모리 위치(101)에 기입하기 때문이다. 따라서, 라인 11에서 또는 그 직전에 예외가 발생하는데, 이는 값 z가 적절한 정적 분석 결과 세트 {1,8}의 멤버가 아니기 때문이다. PacketRead의 리턴 어드레스를 덮어씀으로써, 프로그램 실행은 라인 5를 계산한 후에 라인 6으로 리턴하지 않는다. 그러나, 이러한 에러는 검출되는데, 이는 프로그램이 리턴 어드레스를 판독하기 전에 변수 authenticated에 대해 설명한 것과 유사한 방식으로 관련 메모리에서 체크가 행해지기 때문이다. 이러한 체크는 에러를 플래그 업(flag up)하는데, 이는 리턴 어드레스가 판독되는 프로그램 위치가 리턴 어드레스에 대응하는 관련 메모리 위치에 값 z를 갖기 때문이다. 후술하는 바와 같이, 이러한 관련 메모리 위치는 함수 엔트리 시에 0으로 설정되고, 그것이 0인지에 대한 체크가 함수 리턴 시에 추가된다. 이러한 체크는 공격이 리턴 어드레스를 덮어쓸 때 실패하게 되는데, 이는 연관된 관련 메모리가 값 z를 갖기 때문이다.
따라서, 도 1c에서, 피젼 홀들의 아래 라인에 의해 표현되는 '관련' 메모리는 전술한 바와 같은 실행 시간 정의 테이블(RDT)의 일부의 일례이다.
어느 곳에나 기입할 수 있고 심지어 데이터를 실행할 수 있는 강력한 공격자의 존재하에 데이터 흐름 보전을 실시하기 위해, RDT의 탬퍼링, 코드의 탬퍼링 또는 도구의 바이패스를 방지한다. 이것은 임의의 적절한 방식으로 달성된다.
예를 들어, RDT 탬퍼링은 타겟 어드레스가 RDT에 할당된 메모리 영역 내에 있는지를 체크하도록 기입들을 도구화함으로써 방지된다. RDT에 기입하려는 임의의 시도는 예외를 생성한다. 다른 예에서, 코드 탬퍼링은 동일 체크들을 이용하여, 또는 코드 페이지들에 대한 판독 전용 보호를 이용하여 방지된다.
RDT를 보호하는 또 하나의 방법은 프로그램을 수정하여, 기입된 어드레스들 중 어느 것도 RDT를 포함하는 메모리를 참조할 수 없도록 하는 것을 포함한다. 예를 들어, RDT가 어드레스 4000000h에 유지되고, 어떠한 다른 프로그램 액세스 가능 데이터 구조도 4000000h 위에 있지 않은 경우, 프로그램에 의해 기입될 각각의 어드레스와 3FFFFFFH를 논리합함으로써 RDT가 보호될 수 있다.
공격자가 도구를 바이패스하는 것을 방지하기 위해, 본 발명은 간접 제어 흐름 전달들의 타겟 어드레스들의 탬퍼링을 방지한다. 본 발명은 전술한 바와 같은 프로그래머 정의 제어 데이터의 기입들 및 판독들을 도구화한다. 또한, 본 발명은 동일한 방식으로 컴파일러에 의해 추가된 제어 데이터의 기입들 및 판독들을 도구화한다. 예를 들어, 리턴 어드레스에 대한 RDT 엔트리를 공지된 값으로 설정하고, 엔트리가 리턴 시에 그 값을 유지하는지를 체크한다.
도구화되지 않은 소프트웨어에 비해 오버헤드가 증가한다. 예를 들어, 메모리에 대한 각각의 기입에 대해 관련 메모리에 대한 또 하나의 기입이 행해진다(도 1c가 발생한다). 그러나, 보다 낮은 오버헤드를 위해 커버리지를 트레이드오프하는 것이 가능하다. 데이터 흐름 그래프가 소정의 사용들에 대해 도달 정의들을 상술하지 않는 경우, 그러한 사용들은 도구화되지 않으므로, 소정의 공격들은 검출되지 않을 수도 있지만, 오버헤드는 낮아질 것이다. 본 발명은 제어 데이터의 사용들이 도구화되는 경우에 여전히 데이터 흐름 보전을 보장한다. 일례에서, 본 발명의 방법은 함수 외부의 정의들 및 제어 데이터의 사용들 없이 로컬 변수들의 사용들만을 도구화한다. 이 예는 낮은 오버헤드를 갖고 많은 관심 있는 공격들을 여전히 파악할 수 있으므로 흥미롭다. 예를 들어, 이 예는 제어 흐름 보전을 침해하는 임의의 공격 및 전술한 비제어 데이터 공격 예를 방지할 수 있다.
도구화된 프로그램이 실행될 때, 정적으로 계산된 데이터 흐름 그래프로부터의 임의의 편차는 예외를 발생시킨다. 분석은 보존적이므로, 거짓 양성은 존재하지 않는다. 예외가 존재하는 경우, 프로그램은 잠재적 공격 또는 프로그래밍 에러인 에러를 갖는다.
도 4는 맵핑 데이터 구조를 유지하고 소프트웨어 프로그램의 보전을 체크하는 방법의 흐름도이다. 이제 설명되는 바와 같이, 이 흐름도의 윗부분은 보전 체크 프로세스와 관련되며, 아랫부분은 데이터 흐름 추적 프로세스와 관련된다. 보호될 소프트웨어 프로그램 내의 위치 l의 명령이 실행된다(박스 30 참조). 프로그램 위치 l에서 판독되어 어드레스 a에 저장된 모든 변수 v에 대해(박스 31 참조), 대응 관련 메모리 내의 엔트리 da가 적절한 프로그램 위치에 대한 정적 분석 동안 결정된 프로그램 위치들의 세트의 멤버인지를 알기 위해 체크가 행해진다(박스 32 참조). 불일치가 발견되는 경우, 에러가 통지된다(박스 33 참조). 에러는 임의의 적절한 방식으로 통지된다. 예를 들어, 예외가 발생하거나, 프로세스가 종료되거나, 디버깅 로그에 기입이 행해진다. 체크가 l에서 각각의 변수에 대해 성공적으로 통과된 경우(종료 박스 34 참조), 본 방법은 데이터 추적 프로세스로 진행한다. 이것은 프로그램 위치 l에서 기입된 모든 메모리 또는 레지스터 어드레스 a에 대해 적절한 관련 메모리 위치의 내용들을 l로 갱신하는 것을 포함한다(da를 l로 갱신하는 박스 36 참조). "종료" 프로세스(박스 37 참조)가 프로세스를 완료한다.
전술한 바와 같이, 도구화는 수정된 컴파일러 또는 바이너리 재기입 도구를 이용하여 달성될 수 있다. 머신 에뮬레이터 또는 머신 에뮬레이터의 하드웨어 등가물을 사용하는 것도 가능하다. 이러한 예들은 이제 도 5 내지 8을 참조하여 더 상세히 설명된다. 이러한 예들 각각에서, 컴파일러, 바이너리 재기입 도구, 머신 에뮬레이터 또는 하드웨어 등가물은 이 분야에 공지된 바와 같은 적절한 운영 체제 소프트웨어와 함께 적절한 컴퓨터를 이용하여 구현된다.
도 5는 소프트웨어를 보호하기 위한 수정된 컴파일러의 개략도이다. 보호될 소프트웨어 프로그램의 소스 코드(50)를 프로세스에 입력하여 정적 분석을 수행하고 정적 데이터 흐름을 계산한다(박스 51 참조). 이러한 정적 분석으로부터의 데이터 흐름에 대한 정보는 관련 프로세서(54)를 갖는 수정된 컴파일러(52)에 제공된다. 수정된 컴파일러는 레지스터 또는 메모리 어드레스가 기입될 때마다 코드를 발행한다. 이 코드는 (전술한 바와 같은) 동적 실행에서 레지스터 또는 메모리 셀의 현재 값을 기입한 프로그램 위치의 식별자 da에 각각의 레지스터 또는 메모리 어드레스를 맵핑하는 데이터 구조를 유지한다. 또한, 컴파일러는 메모리 또는 레지스터 어드레스에 저장된 변수 v가 소정 위치 l에서 사용될 때마다 데이터 흐름의 보전을 체크하기 위한 코드를 발행한다. 이 코드는 da가 Slv 내의 위치들 중 하나 인지를 체크한다. 이 코드는 데이터 구조 내에서 da의 값을 탐색하고, 그 값이 Slv 내에 있는지를 체크한다. Slv 내의 위치들의 식별자들은 코드 내에 내장되거나, 변수들 및 위치들을 위치들의 세트들로 맵핑하는 테이블 내에서 탐색될 수 있다. 첫 번째 접근법은 특히 양호한 성능을 얻을 수 있으며, 공격자가 테이블을 덮어쓰는 것을 방지한다. 어느 경우에나, 체크에 실패하는 경우, 발행된 코드는 예를 들어 예외를 발생시킴으로써 에러를 통지한다.
수정된 컴파일러의 출력은 데이터 흐름 보전 기능이 통합된 실행가능 소프트웨어(53)이다. 이와 같이, 간단하고 효율적인 방식으로 데이터 흐름 보전 기능이 기존 소스 코드에 제공될 수 있다.
도 6은 소프트웨어를 보호하기 위한 바이너리 재기입 도구(62)의 개략도이다. 이것은 실행가능 코드(60)를 입력으로서 취하고, 또한 전술한 바와 같은 정적 분석(61)의 결과들에 대한 액세스를 갖는다. 이 예에서는, 정적 데이터 흐름 정보(61)를 이용하여 바이너리 재기입 도구(62)를 구동함으로써, 위의 컴파일러 기반 구현에 대해 설명된 바와 같은 동적 데이터 흐름의 보전을 체크하기 위한 코드를 발행한다. 이와 같이, 이전에 릴리스된 바이너리들에 데이터 흐름 보전 기능을 추가하는 것이 가능하다. 바이너리 재기입 도구(62)의 출력은 수정된 실행가능 코드(63)를 포함한다.
도 7은 소프트웨어를 보호하기 위한 머신 에뮬레이터(70)의 개략도이다. 이것은 정적 데이터 흐름 정보(61)는 물론, 보호를 위한 실행가능 코드(60)를 입력으로서 취한다. 머신 에뮬레이터(70)는 소프트웨어의 실행을 에뮬레이트하고, 에러들 또는 예외들(71)을 생성한다. 이러한 접근법은 이전에 릴리스된 바이너리들에 검출을 추가하는 데 이용될 수 있다. 이제, 도 8을 참조하여 설명되는 바와 같이, 머신 에뮬레이터는 2개의 데이터 구조(80, 81)를 유지한다. 제1 데이터 구조(80)인 맵핑 1은 각각의 메모리 및 레지스터 어드레스를 식별자 da에 맵핑하며, 머신 에뮬레이터는 레지스터 또는 메모리에 기입하는 CPU 명령을 에뮬레이트할 때마다 이 데이터 구조를 갱신한다(박스 82 참조). 머신 에뮬레이터는 또한 결정된 정적 분석이 사용된 값을 기입할 수 있는 세트들 Slv 또는 위치들에 변수들의 사용들을 맵핑하는 제2 데이터 구조(81)(맵핑 2)를 유지한다. 에뮬레이터는 레지스터 또는 메모리 어드레스 a에 저장된 변수 v를 판독하는 위치 1의 명령을 처리할 때, 맵핑 2 내의 Slv 및 변수가 제1 데이터 구조인 맵핑 1 내에 최종 기입된 위치 da를 탐색한다(박스 83 참조). da가 Slv 내에 있지 않은 경우(박스 84 참조), 에뮬레이터는 예를 들어 적절한 에러 핸들러를 호출함으로써 에러를 통지한다(박스 85 참조).
다른 실시예에서, 데이터 흐름 보전 기능은 머신 에뮬레이터에 대해 전술한 것과 동일한 기술 또는 임의의 다른 적절한 기술을 이용하여 하드웨어로 구현된다. 이러한 접근법은 데이터 흐름 보전 기능이 이전에 릴리스된 바이너리들에 추가되는 것을 가능하게 한다.
도 5 내지 8과 관련하여 설명된 임의의 방법을 이용함으로써, 본 발명은 공격들로부터 소프트웨어 프로그램들을 보호할 수 있다. 오래된 애플리케이션들을 포팅하거나, 특별한 안전한 방언들을 사용하여 새로운 애플리케이션들을 작성할 필요는 없다. 본 발명은 또한 함수 포인터와 같은 프로그램의 특정 부분만이 아니라 프로그램 내의 모든 데이터 흐름을 보호할 수 있다. 본 발명은 또한 타겟 프로그램의 제어 흐름을 변경하지 않는 공격들에 대해 성공할 수 있다. 이롭게도, 본 방법의 특정 실시예들은 거짓 양성들을 생성하지 않는다.
이제, 정적 분석에 대한 더 상세한 설명이 제공된다.
정적 분석
전술한 바와 같이, 정적 분석은 명령에 의해 판독된 각각의 값에 대해 그 값을 기입할 수 있는 명령들의 세트에 대한 정보와 같은 데이터 흐름 정보를 포함한다. 도 3은 정적 분석의 예시적인 방법의 흐름도이다.
모든 프로그램 위치 l에 대해(박스 20 참조) 그리고 그 프로그램 위치 l에서 사용되는 모든 변수 v에 대해(박스 21 참조), 프로그램 위치들의 세트 Slv에 대한 정보가 얻어진다. 예를 들어, l에서 사용된 v의 값을 기입할 수 있는 프로그램 위치들의 세트 Slv에 대한 정보가 얻어진다. 소정 예들에서, 본 방법은 프로그램 위치의 클래스들에 대한 정보 또는 후술하는 바와 같은 프로그램 위치들에 대한 다른 정보를 이용한다. 2개의 "종료" 문장(박스 23 및 24 참조)이 완료를 위해 도 3에 도시되어 있다.
전술한 바와 같이, 프로그램 위치들의 세트에 대한 정보를 계산하는 단계는 도달 정의 분석을 이용하는 단계를 포함할 수 있다. 특정 예에서, 본 방법은 2개의 분석, 즉 흐름에 민감한 절차내 분석 및 흐름에 둔감하고 컨텍스트에 둔감한 절차간 분석의 조합을 이용한다.
절차내 분석은 흐름 제어를 고려한다. 일례로, 이 분석은 Appel, A.W. "Modern Compiler Implementation in Java" Cambridge University Press, 1998에 설명된 바와 같이 정적 단일 할당 표현을 트래버스함으로써 구현될 수 있다. 본 방법은 이러한 분석을 이용하여, 자신들이 선언된 함수 외부에 어떠한 정의들도 갖지 않는 로컬 변수들의 사용들에 대한 도달 정의들을 계산한다. 절차간 분석은 모든 다른 사용들에 대한 도달 정의들을 계산하는 데 사용된다.
절차간 분석은 큰 프로그램들에 확장될 수 있도록 덜 엄밀하다. 이것은 제어 흐름을 무시하며, 함수들을 분석할 때 호출 컨텍스트를 고려하지 않는다. 본 발명은 각각의 포인터가 지시할 수 있는 개체들의 세트를 계산하기 위해 지시(points-to) 분석을 구현하였으며, 이러한 지시 세트들을 이용하여 도달 정의들을 계산한다. 지시 분석은 Anderson, L. "Program Analysis and Specialisation for the C Programming Language" PhD thesis, University of Copenhagen, 1994에 설명되어 있다. 그러나, 지시 분석을 이용하는 것이 필수적은 아니며, 각각의 포인터가 지시할 수 있는 개체들의 세트를 계산하는 임의의 적절한 방법이 이용될 수 있다.
예를 들어, 지시 분석은 필드 기반이 아니라 필드에 둔감하다(즉, 이것은 구조체, 공용체 또는 클래스 내의 상이한 필드들을 구별하지 못한다). 이러한 분석은 서브세트 제한들을 수집하기 위해 모든 소스 파일에 대해 글로벌 패스를 행한다. 각각의 할당 x=y는 서브세트 제한 x⊇y로 귀착되는데, 이 제한은 x의 가능한 값들의 세트가 y의 가능한 값들의 세트를 포함함을 의미한다. 이 분석은 컴파일러를 이용하여 각각의 소스 파일을 하이 레벨 중간 표현(HIR)으로 컴파일하고, HIR 내의 모든 서브세트 제한들을 파일에 기입한다. 이러한 글로벌 패스 후에, 분석은 일정한 포인트에 도달할 때까지 모든 제한들에 대해 반복함으로써 지시 세트들을 계산한다. 이어서, 분석은 지시 세트들을 파일에 저장한다.
글로벌 패스 동안, 본 방법은 다른 함수들에서 판독될 수 있는 위치들에 기입하는 명령들의 식별자들을 수집한다. 이들은 포인터들을 역참조함으로써 얻어지는 위치들, 정적 및 글로벌 변수들 및 어드레스가 취해지는 로컬 변수들에 대한 기입들을 포함한다. 이러한 정보도 파일에 기입된다.
본 방법은 지시 세트들 및 글로벌 패스 동안 수집된 할당들을 이용하여 절차간 도달 정의들을 계산한다. 변수들 및 임시 변수(temporary)들의 사용들에 대해, 도달 정의들의 세트는 변수(또는 임시 변수)에 대한 모든 할당의 식별자들을 포함하는 세트와 변수(또는 임시 변수)를 지시할 수 있는 역참조들 또는 포인터들에 대한 모든 할당의 식별자들을 포함하는 세트들의 합집합이다. 포인터 역참조들에 대해, 도달 정의들의 세트는 역참조된 포인터에 대한 모든 할당의 식별자들을 포함하는 세트와 포인터가 지시할 수 있는 모든 변수의 도달 정의들의 세트들의 합집합이다. 절차간 도달 정의들의 세트들은 프로그램을 도구화하는 데 사용되는 파일에 기입된다.
이 예에서, 절차내 및 절차간 분석들 양자는 메모리 내의 독립 개체들의 상대적인 레이아웃이 미정인 것으로 가정한다. 이들은 정확한 프로그램들이 메모리 내의 독립 개체들 사이를 네비게이트하기 위해 포인터 연산을 이용하지 않는 것으로 가정한다.
기존의 컴파일러들은 여러 표준 최적화를 구현할 때 이러한 가정을 이미 행하였다. 따라서, 이러한 가정은 대다수의 프로그램에 적용된다. 그러나, 대부분의 공격들에 의해 침해되는 것은 바로 이러한 가정이다. 데이터 흐름 보전 실시는 이러한 공격들을 검출하고 방지한다.
이제, 소프트웨어에 데이터 흐름 추적 명령들 및 데이터 흐름 체크 명령들을 추가하는 프로세스에 대한 더 상세한 설명이 제공된다.
도구화
특정 예에서, 본 발명은 프로그램의 하이 레벨 중간 표현에 새로운 하이 레벨 명령들을 삽입함으로써 도구를 추가한다. 예를 들어, 명령들은 다음과 같은 형태를 갖는다.
SETDEF opnd id
CHECKDEF opnd set Name
명령들에 대해 이러한 형태를 사용하는 것이 필수적은 아니라는 점에 유의한다. 데이터 흐름을 추적하고 데이터 흐름 보전을 체크하기 위한 임의의 적절한 형태의 명령들이 사용될 수 있다.
제1 명령은 opnd에 대한 RDT 엔트리를 id로 설정한다. 제2 명령은 RDT로부터 opnd에 대한 실행 시간 정의 식별자를 검색하고, 식별자가 setName이라는 명칭을 가진 도달 정의 세트 내에 있는지를 체크한다. 컴파일러 또는 다른 적절한 엔티티는 CHECKDEF 명령들을 타겟 머신의 어셈블리 언어로 낮출 때 사용되는 세트 명칭들에서 세트 값들로의 맵을 유지한다. 코드의 하이 레벨 표현을 도구화하는 것은 도구화 머신을 소스 언어와 무관하게 그리고 대개는 타겟 아키텍처와 무관하게 하는 이점을 갖는다.
아래는 도달 정의 분석에 의해 계산된 정보로부터 생성된 하이 레벨 도구를 갖는 위에 주어진 예시적인 코드에 대한 예시적인 HIR이다. 100이라는 명칭을 가진 세트는 값 {1,8}을 갖는다. 이 예에서, 본 발명은 레지스터들에 할당되는 것을 보장할 수 있는 임시 변수들을 도구화하지 않으며, 또한 &packet의 사용들을 도구화하지 않는데, 이는 로컬 변수들의 어드레스들이 프레임 포인터에 상수를 추가함으로써 계산되기 때문이다.
하이 레벨 도구가 어떻게 어셈블리 언어로 낮아지는지를 설명하기 전에, 본 발명이 RDT를 어떻게 구현하는지를 설명한다. 효율적인 액세스를 가능하게 하기 위해, RDT는 일례에서 도구화된 프로그램 내의 각각의 32비트 메모리 워드에 대한 정의 식별자를 갖는 어레이로서 도구화된다. 각각의 정의 식별자는 예를 들어 2 바이트 길이이다. 이것은 약 50%의 공간 오버헤드로 이어진다.
본 발명은 각각의 32비트 워드에 대한 단일 식별자를 기록할 수 있는데, 이는 본 발명이 상이한 도달 정의 세트를 갖는 2개의 변수가 통일한 정렬된 32비트 메모리 워드를 공유하지 않는 코드를 생성할 수 있기 때문이다. 본 발명의 도달 정의 분석은 개체들 내의 상이한 필드들 및 어레이들 내의 상이한 요소들을 구별하지 않으므로, 어레이들 및 개체들의 레이아웃을 변경할 필요가 없다. 본 발명은 로컬 변수들을 스택 프레임 내에 레이아웃할 때 32비트의 최소 정렬을 이용하기 위해 컴파일러만을 변경한다. 함수 독립 변수들, 전역 변수들 및 힙이 할당된 개체들이 적절히 정렬된다.
특정 예에서, 본 발명은 가상 어드레스 공간의 최하위 1GB를 도구화되고 있는 프로그램에, 그리고 512MB를 RDT에 할당하고, 이들 사이에 가드 페이지를 갖는데, 즉 가드 페이지는 어드레스 40000000h에 있고, RDT의 베이스는 어드레스 40001000h에 있다. 따라서, 피연산자에 대한 RDT 엔트리의 어드레스를 계산하기 위하여, 본 발명은 간단히 피연산자의 어드레스를 취하여 이를 오른쪽으로 2만큼 시프트하고, 그 결과에 2를 곱하고, 40001000h를 더한다. 이러한 레이아웃은 또한 RDT의 탬퍼링을 방지하기 위한 기입들의 타겟 어드레스들의 효율적인 경계 체크를 가능하게 한다. 일 구현에서, 본 발명은 타겟 어드레스와 cOOOOOOOh의 비트와이즈 AND가 0이 아닌 경우에 예외를 생성한다. 다른 구현에서, 본 발명은 비트 마스킹을 이용하여, 애플리케이션이 RDT에 기입하는 것을 방지한다. 예를 들어, 본 발명은 3fffffffh로 타겟 어드레스를 마스킹하여, 이것이 RDT를 참조하는 것을 방지한다. 가드 페이지는 기입에 대한 타겟 어드레스만을 체크하고 그 크기는 무시할 수 있게 한다.
하이 레벨 도구는 아래 예들에 나타나는 바와 같이 x86 어셈블리로 낮아질 수 있다. 본 발명은 SETDEF authenticated 1을 다음으로 낮춘다.
제1 명령은 기입의 타겟 어드레스를 ecx에 로딩하고, 다음 3개 명령은 그 어드레스에 대한 경계 체크를 수행한다. 체크에 실패한 경우, 본 발명은 이제 브레이크 포인트 (int 3)을 생성하는데, 이는 디버깅을 위해 매우 편리하다. 또 하나의 예외는 생성 용도에 보다 적합할 것이다. shr 명령을 이용하여, _authenticated에 대한 RDT 엔트리의 어드레스를 계산하며, mov 명령은 엔트리를 갱신한다. 피연산자의 크기가 32비트보다 큰 경우, 다른 워드들에 대응하는 RDT 내의 엔트리들을 갱신하는 것이 필요하다. 본 발명은 단일 mov 명령으로 식별자의 2개 사본의 연결을 이동시킴으로써 64비트 피연산자들에 대한 엔트리들을 갱신할 수 있다. 그러나, 본 발명은 보다 큰 피연산자들을 갖는 추가 명령들을 추가한다.
CHECKDEF authenticated 100 명령은 다음으로 낮춰진다.
이 코드는 _authenticated에 대한 RDT 엔트리 내의 정의 식별자와 정의 식별자 세트 100을 비교한다. 피연산자가 32비트보다 클 경우, 본 발명은 다른 워드들에 대한 추가 비교들을 추가한다.
또한, 본 발명은 컴파일 프로세스에서 도입되는 제어 데이터의 정의들 및 사용들을 도구화한다. 예를 들어, 함수 엔트리 상에서, 본 발명은 함수의 리턴 어드레스에 대응하는 RDT 엔트리를 0으로 설정하기 위해 아래의 코드를 추가한다.
위의 PacketRead 및 authenticated를 포함하는 코드의 예로 돌아가면, 도구화된 코드는 더 이상 리턴 어드레스를 덮어쓰는 제어 데이터 공격 또는 authenticated를 덮어쓰는 비제어 데이터 공격에 취약하지 않다. 분석은 authenticated가 packet과 에일리어싱되지 않는 것으로 결정하므로, packet에 대한 기입들은 1 또는 8과 다르도록 보증되는 식별자들을 갖는다. 또한, 식별자 0은 리턴 어드레스들에 대한 함수 엔트리 상에서만 사용된다. 따라서, 어떠한 리턴 어드레스 덮어쓰기도 검출될 것이다.
프로그램들은 종종 여러 라이브러리를 포함하는 복잡한 실행 시간 환경에 의존한다. 이러한 라이브러리들의 소스 코드를 분석하는 것은 종종 불가능하다. 종종, 바이너리들만이 이용 가능하며, 소스 코드가 이용 가능할 때에도 소정 함수들은 어셈블리로 수기 작성된다. 그러나, 많은 공격들은 라이브러리들 내의 취약성을 이용한다. 예를 들어, C 라이브러리 내의 스트링 조작 함수들은 버퍼 오버플로우 취약성으로 악명이 높다.
소스 코드 분석을 이용하여 기입들을 도구화하는 이전의 기술들은 라이브러리 호출들이 안전 체크를 수행하도록 랩핑(wrapping)되지 않는 한 어떠한 보증도 제공하지 못한다. 이러한 이전 기술들은 C의 어레이 경계 체크 및 메모리 안전 방언들을 포함한다. 때때로, 랩퍼(wrapper)들도 메모리 레이아웃 변환을 수행하는 것이 요구된다. 이러한 랩퍼들의 기입은 번거로울 수 있다.
본 발명의 데이터 흐름 보전 실시 방법들은 옵션으로 어떠한 라이브러리 랩퍼들도 필요로 하지 않는다. 프로그램이 분석되지 않은 라이브러리 함수들을 호출할 때, 분석은 소정의 사용들에 대한 도달 정의 세트들을 계산할 수 없으나, 본 발명은 모든 다른 사용에 대한 데이터 흐름의 보전을 보증한다. 이를 행하기 위해, 본 발명은 라이브러리 바이너리들을 도구화하여, 이들이 기입하는 임의의 메모리에 대한 RDT 엔트리들을 무효 정의 식별자로 설정한다. 이것은 소스 코드 없이도 수행될 수 있다.
본 발명은 커버리지를 증가시키도록 라이브러리 랩퍼들을 정의하는 옵션을 제공한다. 예를 들어, 라이브러리 함수에 대한 랩퍼의 정의는 함수 호출이 지시 분석에 추가되는 서브세트 제한들을 기술하고 랩퍼 함수를 작성하는 것을 포함한다. 랩퍼는 라이브러리에 의해 판독되는 메모리에 대한 정의 식별자들을 체크하고, 라이브러리를 호출하며, 라이브러리에 의해 기입되는 메모리에 대한 정의 식별자들을 설정한다. 본 발명은 원시 함수 대신에 랩퍼를 호출하고, 랩퍼에게 라이브러리 함수에 의해 판독되는 메모리에 대한 도달 정의 세트들 및 그가 기입하는 메모리에 대한 정의 식별자를 제공하도록 코드를 도구화한다. 예를 들어, 윈도우 NT(상표) 운영 체제 호출 CreateProcess에 대한 랩퍼는 독립 변수들로서 제공되는 애플리케이션 명칭 및 커맨드 라인 스트링들의 보전을 체크할 수 있다.
아래에 memcpy에 대한 예시적인 랩퍼가 제공된다. CHECK_BOUNDS는 memcpy가 RDT 내에 기입되지 않는 것을 보장하며, CHECK_ARRAY는 src 내의 바이트들에 대한RDT 내의 식별자들이 defArgs에 제공되는 도달 정의 세트 내에 있는지를 체크한다. dest에 기입된 바이트들에 대한 RDT 엔트리들은 UPDATE_RDT에 의해 defld로 설정된다.
최적화
본 발명의 데이터 흐름 보전 실시 방법은 소정의 오버헤드들을 도입하는데, 즉 각각의 정의는 RDT에 대한 기입을 도입하며, 각각의 사용 체크는 RDT로부터의 판독에 이어서 사용에 대한 도달 정의들의 세트 내의 각각의 식별자에 대한 비교들을 도입한다.
본 출원인은 이러한 오버헤드를 줄이는 소정의 방법들을 개발하였다. 이들은 4개 타입의 방법으로 구분된다. 첫째, 본 발명은 정의들을 개명하여, CHECKDEF들에서의 비교들의 수를 줄이거나, 비교들의 묶음이 보다 싸게 수행될 수 있게 한다. 둘째, 본 발명은 소정의 SETDEF들 및 CHECKDEF들의 제거가 데이터 흐름 보전을 손상시키지 않는 것이 보장될 때 정적 분석을 이용하여 이들을 제거할 수 있다. 마지막으로, 상이한 정의들이 실행 시간에 상이한 빈도로 사용에 이를 수 있다. 본 발명은 이러한 바이어스를 이용하도록 실행 시간 시스템을 수정할 수 있다.
정의들의 개명
제1 타입의 최적화는 CHECKDEF들이 보다 효율적인 원시 코드로 컴파일될 수 있도록 정의 식별자 공간을 재구성하려고 시도한다.
본 출원인은 2개의 기술을 개발하였다. 제1 기술은 동일 클래스 내의 모든 정의들에 동일 식별자를 안전하게 할당할 수 있게 하는 방식으로 정의들을 등가 클래스들로 구분한다. 2개의 정의는 이들이 정확히 동일한 세트의 사용들을 갖는 경우에 등가이다. 이것은 CHECKDEF들에서의 비교들의 수 및 식별자들을 표현하는 데 필요한 비트들의 수를 줄인다. 예를 들어, PacketRead 예에서 _authenticated의 양 정의들은 정적 분석에 의해 계산되는 동일 세트의 사용들을 갖는다. 본 발명은 동일 식별자 1을 양 정의들에 할당한다. 따라서, CHECKDEF authenticated 100은 하나의 비교만을 필요로 한다. 이것은 다음과 같이 컴파일된다.
제2 타입의 방법은 식별자들의 세트에 대한 비교들이 보다 빠르게 행해질 수 있도록 정의들을 개명하는 것이다. 본 발명은 비교들이 상이한 방식에서 상이한 비용으로 수행될 수 있다는 사실을 이용한다. 일 구현에서, 3개 형태의 비교가 가능한데, 즉 (i) 일 범위의 연속 식별자들 0...n에 대한 체크가 n에 대한 단일의 무부호 정수 비교에 의해 구현될 수 있고, (ii) 일 범위의 연속 식별자들 n...m에 대해 체크가 n을 감산하고 m-n에 대해 무부호 비교를 수행함으로써 구현될 수 있으며, (iii) 단일 식별자 n에 대한 체크가 통상의 비교에 의해 구현될 수 있다. 다른 구현들에서는, 다양한 비용으로 수행될 수 있는 상이한 또는 추가적인 형태의 체크가 존재할 것이다.
본 발명은 CHECKDEF의 비용을 그것을 수행하는 데 필요한 감산들 및 비교들의 수로서 정의한다. 예를 들어, 예시적인 구현에서, {1,3,7}을 체크하는 비용은 3이지만, {0,1,2}를 체크하는 비용은 단지 1이다. 식별자 세트의 총 비용은 그에 대한 단일 CHECKDEF의 비용과 프로그램에서 발생하는 그에 대한 CHECKDEF들의 수를 곱한 값이 된다. 예시적인 구현에서, 본 발명은 발생들의 수의 정적 카운트를 이용한다. 이 분야의 전문가들은 다른 구현들이 정적 발견적 방법과 같은 다른 기술들을 이용하여, 실행되는 CHECKDEF들의 수를 추정하거나, 실행 시간 피드백을 이용하여, 실행되는 CHECKDEF들의 수를 카운트 또는 추정할 수 있다는 것을 알 것이다.
본 발명은 발견적 방법을 이용하여 모든 세트의 총 비용의 합을 줄이려고 시도한다. 특정 예는 간단한 그리디 알고리즘을 이용하는데, 즉 본 발명은 총 비용을 줄이는 순서로 세트들을 분류하고, 가장 비용이 큰 세트들을 연속 식별자 범위들에 할당하도록 진행한다. 본 발명은 식별자 0에서 시작하며, 따라서 최대 총 비용을 갖는 세트는 가장 싼 비교들로부터 이익을 얻는다.
경계 체크의 제거
본 발명은 공격자가 RDT를 탬퍼링하는 것을 방지하기 위해 기입들의 타겟 어드레스들을 체크한다. 본 발명은 정적으로 안전한 것으로 결정할 수 있는 모든 기입들로부터 그러한 체크들을 제거함으로써 SETDEF들을 최적화할 수 있다. 특정 예에서, 스택 포인터, 프레임 포인터, 또는 글로벌 또는 정적 변수의 어드레스에 작은 상수 오프셋(아마도 0)을 더함으로써 타겟 어드레스가 얻어지는 경우에는 기입이 안전하다. 필수적은 아니지만 바람직하게는, 오프셋과 기입되고 있는 데이터의 크기의 합은 4KB(이것은 RDT 앞에 할당하는 가드 페이지의 크기이다)보다 작다.
예를 들어, PacketRead 예에서, _authenticated는 프레임 포인터에 작은 상수를 더함으로써 어드레스가 얻어지는 로컬 변수이므로, 본 발명은 SETDEF authenticated 1로부터 경계 체크를 제거할 수 있다. SETDEF는 다음과 같이 컴파일된다.
SETDEF 및 CHECKDEF의 제거
다른 타입의 최적화는 정적 분석을 이용하여, 소정의 SETDEF들 및 CHECKDEF들을 안전하게 제거한다.
물론, 안전하다는 의미에 대해 주의해야 한다. 두 가지 문제가 존재할 수 있다. 첫째, 본 발명은 데이터 흐름 보전이 상실된 경우에 그의 추론들이 신뢰되지 않는 하이 레벨 분석에 의존하지 않으려고 하는데, 즉 도구화의 온전한 목적은 프로그램의 데이터 흐름 보전이 손상되는 사례들을 검출하는 것이다. 둘째, 본 발명은 컴파일 동안 너무 일찍 체크들을 제거하지 않으려고 하는데, 이는 후속 코드 변환들이 데이터 흐름 보전이 상실되는 상황들을 바꿀 수 있기 때문이다. 따라서, 본 발명은 SETDEF 및 CHECKDEF 동작들이 그들의 HIR 형태로 여전히 존재하지만, 프로그램의 나머지가 이미 고유 명령 세트로 낮아져 발행될 준비가 된 때 최적화를 옵션으로 수행한다.
제1 기술은 함수 외부에 어떠한 정의도 갖지 않고 (이전 섹션에서 안전하다는 정의에 따라) 안전한 기입들에 의해서만 기입되는 로컬 변수들을 식별한다. 이것은 그러한 변수에 대한 모든 SETDEF를 함수 엔트리 상에 배치된 식별자 0을 갖는 단일 SETDEF로 대체한다. 이것은 또한 그러한 변수들에 대한 CHECKDEF들을 간략화하여, 도달 정의들이 {0}으로 설정되게 한다. 이러한 최적화는 안전한데, 이는 안전한 기입들이 데이터 흐름 보전을 위반할 수 없기 때문이다. 따라서, 하나의 SETDEF만이 필요하다.
제2 기술은 데이터 흐름 분석을 수행하여 SETDEF들 및 CHECKDEF들을 제거한다. 이러한 분석은 정적 데이터 흐름 그래프를 계산하는 데 사용하는 도달 정의 분석과 유사하지만, 공격자에 의해 위반될 수 있는 가정들에 의존하지 않는다. 간략화를 위해, 동일 기본 블록 내의 명령 시퀀스들의 사례를 설명한다. 이러한 기술은 임의의 제어 흐름 그래프들 상의 상이한 기본 블록들에 흐름 변수들을 전달하는 사례도 처리한다.
본 발명의 도구화는 아래의 사례들에서 중복된다. 명령들 I1 및 I2가 동일 데이터에 대한 어떠한 중간 기입도 없이 실행되는 동일 데이터에 관한 한 쌍의 SETDEF들 또는 CHECKDEF들인 것으로 가정한다.
1. I1 및 I2가 모두 동일 식별자를 갖는 SETDEF들인 경우, I2는 중복이다.
2. I1 및 I2가 모두 그 데이터에 대한 중간 CHECKDEF를 갖지 않는 SETDEF들인 경우, I1은 중복이다.
3. I1이 ID1에 대한 SETDEF이고, I2가 ID1을 포함하는 세트에 대한 CHECKDEF인 경우, I2는 중복이다(게다가, 데이터 흐름 분석이 올바르게 수행된 경우에 ID1은 I2의 세트 내에 있어야 한다).
4. I1 및 I2가 모두 세트들 IDS1 및 IDS2 각각에 대한 CHECKDEF들인 경우, IDS2는 IDS1 내의 요소들만을 포함하도록 축소될 수 있다(보다 이른 체크는 다른 요소들이 존재하지 않는 것을 보증한다). 또한, IDS1 및 IDS2가 동일 요소들을 보유하는 경우, I2는 제거될 수 있다(보다 이른 체크가 성공한 경우에 보다 늦은 체크가 실패하는 것을 불가능하다).
5. I1이 세트 IDS1에 대한 CHECKDEF이고, I2가 ID2에 대한 SETDEF인 경우, IDS1 = {I2}이면 I2는 중복이다.
실제로, 규칙들 3 및 4는 가장 효과적이다. 규칙 3은 데이터의 사용들이 그들의 정의들 근처에서 발생할 때 많은 CHECKDEF 명령들을 제거한다. 규칙 4는 데이터의 정의와 이들의 사용들의 첫 번째 사이에 에일리어싱 기입들이 존재하는 경우에도 동일 데이터가 반복적으로 사용되는 경우에는 CHECKDEF 명령들을 제거한다.
중복 도구화를 식별하기 위하여, 본 발명은 SETDEF 및 CHECKDEF 동작들로 증대된 고유 코드의 심벌 실행을 이용한다. 본 발명은 각각의 명령 후에 레지스터들의 심벌 상태를, 그리고 SETDEF들 및 CHECKDEF들 후에 RDT의 심벌 상태를 갱신한다. RDT의 심벌 상태는 심벌 메모리 어드레스들을 정의 식별자들의 세트들로 맵핑한다.
일례에서, 본 발명은 간단한 테스트를 이용하여 심벌 어드레스들을 비교한다. 2개의 어드레스가 구문론적으로 동일한 경우, 이들은 동일하다. 이들이 동일 심벌 레지스터 상태에 상이한 오프셋들을 더하여 계산되는 경우에는 이들은 상이하다. 아니면, 이들은 에일리어싱된 메모리 위치들을 참조할 수 있다. 메모리에 대한 기입은 레지스터의 심벌 상태가 기입의 타겟과 에일리어싱될 수 있는 메모리 위치의 내용들을 참조하는 경우에 그 상태를 무효화한다. 또한, 이것은 심벌 RDT 상태로부터 기입의 타겟과 에일리어싱될 수 있는 임의의 메모리에 대한 맵핑들을 제거한다.
본 발명은 심벌 RDT 상태를 검사함으로써 중복 도구화를 제거하기 위해 규칙들을 적용한다. 본 발명은 한번에 하나의 기본 블록에 대해 작용하므로, 명령들이 중복인 경우에 이들을 즉시 제거하며, 이는 블록간 구현에서 개별 패스로 쉽게 이동될 수 있다.
바이어싱된 데이터 흐름의 이용
본 최종 기술은 상이한 정의들이 실행 시간에 상이한 빈도로 사용에 이를 수 있다는 기대에 기초한다. 예를 들어, 아래의 예에서, 정의 D1은 루프 상의 제1 반복시에만 라인 3에 도달한다.
본 발명은 어드레스들을 그들에서 가장 최근에 보여진 정의 식별자로 맵핑하는 제2 글로벌 테이블을 옵션으로 추가한다. 이어서, 2보다 큰 비용을 갖는 세트에 대한 임의의 CHECKDEF에 대해, 본 발명은 테이블 내에 유지되는 값에 대한 비교에 의해 체크를 진행한다. 그 값이 일치하는 경우, 체크는 성공된 것으로 보증된다. 실패한 경우, 본 발명은 테이블을 갱신하고 체크를 진행한다.
대안으로, 본 발명은 프로파일링 정보를 이용하여 멤버쉽 체크들을 재배열할 수 있으며, 따라서 보다 빈번하게 사용에 이르는 정의 식별자들에 대한 체크들이 먼저 수행된다. 프로파일링 정보는 프로그램의 프로파일링 실행들 동안 수집될 수 있으며, 체크들은 프로그램이 컴파일될 때 재배열될 수 있다. 대안으로, 프로파일링 정보는 프로그램의 정상 실행들 동안 수집될 수 있으며, 체크들은 프로그램이 실행되는 동안 동적으로 재배열될 수 있다.
이 분야의 전문가들은 프로그램 명령들을 저장하는 데 사용되는 저장 장치들이 네트워크를 통해 분산될 수 있다는 것을 알 것이다. 예를 들어, 원격 컴퓨터가 소프트웨어로서 설명된 프로세스의 일례를 저장할 수 있다. 로컬 또는 단말 컴퓨터가 원격 컴퓨터에 액세스하고 소프트웨어의 일부 또는 전부를 다운로드하여 프로그램을 실행할 수 있다. 대안으로, 로컬 컴퓨터는 필요에 따라 소프트웨어의 부분들을 다운로드하거나, 일부 소프트웨어 명령들을 로컬 단말기에서 실행하고 일부를 원격 컴퓨터(또는 컴퓨터 네트워크)에서 실행할 수 있다. 이 분야의 전문가들은 또한 이 분야의 전문가들에게 공지된 통상의 기술들을 이용함으로써 소프트웨어 명령들의 모두 또는 일부가 DSP, 프로그래머블 로직 어레이 등과 같은 전용 회로에 의해 수행될 수 있다는 것을 알 것이다.
여기에 주어지는 임의의 범위 또는 장치 값은 전문가에게 자명하듯이 추구하는 효과의 상실 없이 확장 또는 변경될 수 있다.
여기에 설명되는 방법들의 단계들은 임의의 적절한 순서로 또는 적절한 경우에는 동시에 수행될 수 있다.
바람직한 실시예의 상기 설명은 단지 예시적으로 주어지며, 이 분야의 전문가들에 의해 다양한 변경이 이루어질 수 있음을 이해할 것이다. 위의 명세서, 예들 및 데이터는 본 발명의 전형적인 실시예들의 구조 및 사용의 완전한 설명을 제공한다. 본 발명의 다양한 실시예가 소정의 상세도로 또는 하나 이상의 개별 실시예와 관련하여 전술되었지만, 이 분야의 전문가들은 본 발명의 사상 또는 범위를 벗어나지 않고 개시된 실시예들에 대해 다양한 변경을 행할 수 있다.
Claims (20)
- (i) 소프트웨어 프로그램의 정적 분석의 결과들에 대한 액세스를 제공하는 단계 - 상기 정적 분석 결과들은 데이터 흐름 정보를 포함함 -;(ii) 상기 소프트웨어 내의 데이터 흐름을 추적하기 위해 데이터 흐름 추적 명령들을 형성하는 단계; 및(iii) 상기 정적 분석 결과들에 대해 상기 추적된 데이터 흐름을 체크하여 상기 소프트웨어 프로그램 내의 잠재적 결함들을 식별하기 위해 체크 명령들을 형성하는 단계를 포함하는 방법.
- 제1항에 있어서, 상기 데이터 흐름 추적 명령들 및 상기 체크 명령들은 수정된 컴파일러(52) 및 이진 재기입 도구(62) 중 어느 하나를 이용하여 형성되어 상기 소프트웨어에 추가되는 방법.
- 제1항에 있어서, 상기 데이터 흐름 추적 명령들 및 상기 체크 명령들은 상기 소프트웨어 프로그램을 실행하는 프로세서를 에뮬레이트하는 머신 에뮬레이터(70) 및 상기 머신 에뮬레이터의 하드웨어 등가물 중 어느 하나를 이용하여 구현되는 방법.
- 제1항 내지 제3항 중 어느 한 항에 있어서, 상기 잠재적 결함들은 제어 데이터 공격들 및 비제어 데이터 공격들 양자를 포함하는 방법.
- 제1항 내지 제4항 중 어느 한 항에 있어서, 상기 정적 분석 결과들은 상기 소프트웨어 프로그램 내의 명령에 의해 판독된 각각의 값에 대해 상기 값을 기입할 수 있는 상기 소프트웨어 프로그램으로부터의 명령들의 세트를 포함하는 방법.
- 제1항 내지 제5항 중 어느 한 항에 있어서, 상기 소프트웨어 프로그램의 소스 코드로부터 도달 정의들을 계산함으로써 상기 소프트웨어 프로그램의 정적 분석을 수행하는 단계를 더 포함하는 방법.
- 제1항 내지 제6항 중 어느 한 항에 있어서, 상기 데이터 흐름 추적 명령들은 식별자들과 메모리 위치들 간의 맵핑을 유지하고, 상기 식별자들은 상기 메모리 위치들 각각에 기입하기 위한 최종 명령의 식별자인 방법.
- 제1항 내지 제7항 중 어느 한 항에 있어서, 상기 체크 명령들은 판독 명령들과 연관되는 방법.
- 제6항에 있어서, 판독 명령과 연관된 체크 명령이 허가된 판독 명령에 의해 판독되는 값을 기입한 명령의 식별자가 상기 정적 분석에 의해 계산된 관련 세트의 요소인지를 체크하는 방법.
- 제5항에 있어서, 명령들의 등가 클래스들을 결정하고, 동일 클래스 내의 모든 명령에 동일 식별자를 할당하는 단계를 더 포함하는 방법.
- 제1항 내지 제10항 중 어느 한 항에 있어서, 상기 데이터 흐름 추적 명령들의 일부 및 상기 체크 명령들의 일부를 제2 정적 분석에 기초하여 제거하는 단계를 더 포함하는 방법.
- 제1항 내지 제11항 중 어느 한 항에 있어서, 도달 정의들을 계산하고, 상기 도달 정의들에 대한 체크들을 행하는 프로세스의 성능을 향상시키기 위해 상기 도달 정의들 중 적어도 일부를 개명함으로써 상기 소프트웨어 프로그램의 정적 분석을 수행하는 단계를 더 포함하는 방법.
- (i) 소프트웨어 프로그램의 정적 분석의 결과들에 액세스하는 단계 - 상기 정적 분석 결과들은 데이터 흐름 정보를 포함함 -;(ii) 상기 소프트웨어 프로그램의 실행 또는 에뮬레이션 동안 상기 소프트웨어 프로그램 내의 데이터 흐름을 추적하는 단계; 및(iii) 상기 정적 분석 결과들에 대해 상기 추적된 데이터 흐름을 체크하고, 불일치가 발견되는 경우에 예외를 발생시키는 단계를 포함하는 방법.
- 컴퓨터 상에서 실행될 때, 제1항 내지 제13항 중 어느 한 항의 모든 단계를 수행하는 컴퓨터 프로그램 코드 수단을 포함하는 컴퓨터 프로그램.
- 제14항에 있어서, 컴퓨터 판독가능 매체 상에 구현되는 컴퓨터 프로그램.
- (i) 소프트웨어 프로그램의 정적 분석의 결과들(61)에 액세스하는 입력 - 상기 정적 분석 결과들은 데이터 흐름 정보를 포함함 -;(ii) 상기 소프트웨어 내의 데이터 흐름을 추적하기 위해 데이터 흐름 추적 명령들을 형성하는 프로세서(54); 및(iii) 상기 정적 분석 결과들에 대해 상기 추적된 데이터 흐름을 체크하여 상기 소프트웨어 프로그램 내의 잠재적 결함들을 식별하기 위해 체크 명령들을 형성하는 프로세서(54)를 포함하는 장치(52, 62, 70).
- 제16항에 있어서, 상기 소프트웨어 프로그램의 소스 코드로부터 도달 정의들을 계산함으로써 상기 소프트웨어 프로그램의 정적 분석을 수행하는 컴파일러(52)를 더 포함하는 장치.
- 제16항 또는 제17항에 있어서, 상기 프로세서(54)는 식별자들과 메모리 위치들 간의 맵핑을 유지하기 위해 상기 데이터 흐름 추적 명령들을 형성하고, 상기 식별자들은 상기 메모리 위치들 각각에 기입하기 위한 최종 명령의 식별자인 장치.
- 제18항에 있어서, 상기 프로세서는 판독되는 값을 기입한 명령의 식별자가 상기 정적 분석에 의해 계산된 관련 세트의 요소인지를 체크하기 위해 각각의 판독 명령에 대한 체크 명령들을 형성하는 장치.
- (i) 소프트웨어 프로그램의 정적 분석의 결과들(61)에 액세스하는 입력 - 상기 정적 분석 결과들은 데이터 흐름 정보를 포함함 -;(ii) 상기 소프트웨어 프로그램의 실행 또는 에뮬레이션 동안 상기 소프트웨어 프로그램 내의 데이터 흐름을 추적하는 프로세서(54)를 포함하고,(iii) 상기 프로세서(54)는 상기 정적 분석 결과들에 대해 상기 추적된 데이터 흐름을 체크하고, 불일치가 발견되는 경우에 예외를 발생시키는 장치.
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
EP06116006.5A EP1870829B1 (en) | 2006-06-23 | 2006-06-23 | Securing software by enforcing data flow integrity |
EP06116006.5 | 2006-06-23 |
Publications (1)
Publication Number | Publication Date |
---|---|
KR20090033228A true KR20090033228A (ko) | 2009-04-01 |
Family
ID=36653105
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020097000952A KR20090033228A (ko) | 2006-06-23 | 2007-05-04 | 데이터 흐름 보전의 실시에 의한 소프트웨어 보호 방법 |
Country Status (5)
Country | Link |
---|---|
US (1) | US9390261B2 (ko) |
EP (1) | EP1870829B1 (ko) |
KR (1) | KR20090033228A (ko) |
CN (1) | CN101473300A (ko) |
WO (1) | WO2008002350A1 (ko) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR102132933B1 (ko) * | 2019-09-09 | 2020-07-10 | 국방과학연구소 | 소프트웨어의 제어 흐름 보호장치 및 그 방법 |
Families Citing this family (75)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8458671B1 (en) * | 2008-02-12 | 2013-06-04 | Tilera Corporation | Method and system for stack back-tracing in computer programs |
US8037529B1 (en) * | 2008-03-19 | 2011-10-11 | Symantec Corporation | Buffer overflow vulnerability detection and patch generation system and method |
US8434064B2 (en) | 2008-03-28 | 2013-04-30 | Microsoft Corporation | Detecting memory errors using write integrity testing |
US8117660B2 (en) | 2008-06-19 | 2012-02-14 | Microsoft Corporation | Secure control flows by monitoring control transfers |
KR101339869B1 (ko) * | 2008-09-22 | 2013-12-10 | 삼성전자주식회사 | 화상형성장치 및 화상형성장치의 저장부에 대한 오버라이트방법 |
US8434073B1 (en) * | 2008-11-03 | 2013-04-30 | Symantec Corporation | Systems and methods for preventing exploitation of byte sequences that violate compiler-generated alignment |
DE102009033211A1 (de) * | 2009-07-15 | 2011-02-03 | Austria Card Plastikkarten Und Ausweissysteme Gmbh | Chipkarte mit Überwachung der Integrität auf Softwarebasis |
US8468512B2 (en) * | 2009-10-30 | 2013-06-18 | International Business Machines Corporation | Abstracting benefit rules from computer code |
US9210184B2 (en) | 2009-12-29 | 2015-12-08 | International Business Machines Corporation | Determining the vulnerability of computer software applications to attacks |
CN101763291B (zh) * | 2009-12-30 | 2012-01-18 | 中国人民解放军国防科学技术大学 | 一种程序控制流错误检测方法 |
US8522217B2 (en) * | 2010-04-20 | 2013-08-27 | Microsoft Corporation | Visualization of runtime analysis across dynamic boundaries |
US9141350B2 (en) * | 2010-04-23 | 2015-09-22 | Vector Fabrics B.V. | Embedded system performance |
US20120089962A1 (en) * | 2010-10-08 | 2012-04-12 | International Business Machines Corporation | Unchanged Object Management |
CN101944064B (zh) * | 2010-10-12 | 2012-01-18 | 中国人民解放军国防科学技术大学 | 一种基于重构控制流图的控制流错误检测优化方法 |
US8677186B2 (en) | 2010-12-15 | 2014-03-18 | Microsoft Corporation | Debugging in data parallel computations |
CN102034045B (zh) * | 2010-12-15 | 2012-11-28 | 上海交通大学 | 低计算机***资源开销的软件漏洞检测*** |
US8997066B2 (en) | 2010-12-27 | 2015-03-31 | Microsoft Technology Licensing, Llc | Emulating pointers |
RU2454714C1 (ru) * | 2010-12-30 | 2012-06-27 | Закрытое акционерное общество "Лаборатория Касперского" | Система и способ повышения эффективности обнаружения неизвестных вредоносных объектов |
US8677322B2 (en) | 2011-06-29 | 2014-03-18 | Microsoft Corporation | Debugging in a multiple address space environment |
US8832655B2 (en) | 2011-09-29 | 2014-09-09 | Accenture Global Services Limited | Systems and methods for finding project-related information by clustering applications into related concept categories |
US11003464B2 (en) | 2012-04-19 | 2021-05-11 | Microsoft Technology Licensing, Llc | Control flow integrity enforcement at scale |
CN102789419B (zh) * | 2012-07-20 | 2015-04-15 | 中国人民解放军信息工程大学 | 一种使用多样本差异比对的软件故障分析方法 |
US8959495B2 (en) | 2012-09-14 | 2015-02-17 | Oracle International Corporation | Unifying static and dynamic compiler optimizations in source-code bases |
US9292693B2 (en) | 2012-10-09 | 2016-03-22 | International Business Machines Corporation | Remediation of security vulnerabilities in computer software |
US9588777B2 (en) | 2012-10-10 | 2017-03-07 | Landmark Graphics Corporation | Method and system of knowledge transfer between users of a software application |
US8881123B2 (en) * | 2012-11-30 | 2014-11-04 | Oracle International Corporation | Enabling symbol resolution of private symbols in legacy programs and optimizing access to the private symbols |
US9148787B2 (en) * | 2012-12-06 | 2015-09-29 | Google Technology Holdings LLC | Apparatus and method for accessing WiFi networks |
US9336100B2 (en) | 2013-12-27 | 2016-05-10 | International Business Machines Corporation | Efficient debugging of memory miscompare failures in post-silicon validation |
US9251045B2 (en) | 2013-12-27 | 2016-02-02 | International Business Machines Corporation | Control flow error localization |
US9569345B2 (en) | 2013-12-27 | 2017-02-14 | International Business Machines Corporation | Architectural failure analysis |
US9454659B1 (en) | 2014-08-15 | 2016-09-27 | Securisea, Inc. | Software vulnerabilities detection system and methods |
US9824214B2 (en) | 2014-08-15 | 2017-11-21 | Securisea, Inc. | High performance software vulnerabilities detection system and methods |
US10599852B2 (en) | 2014-08-15 | 2020-03-24 | Securisea, Inc. | High performance software vulnerabilities detection system and methods |
EP2993605A1 (en) * | 2014-09-02 | 2016-03-09 | Gemalto Sa | System and method for protecting a device against attacks on processing flow using a code pointer complement |
US9514305B2 (en) | 2014-10-17 | 2016-12-06 | Qualcomm Incorporated | Code pointer authentication for hardware flow control |
US9760353B2 (en) * | 2014-12-19 | 2017-09-12 | Signalfx, Inc. | Dynamically changing input data streams processed by data stream language programs |
US9715420B2 (en) | 2015-01-21 | 2017-07-25 | International Business Machines Corporation | String dataflow error detection |
US9672351B2 (en) | 2015-02-02 | 2017-06-06 | Qualcomm Incorporated | Authenticated control stacks |
US9940455B2 (en) | 2015-02-25 | 2018-04-10 | International Business Machines Corporation | Programming code execution management |
US10650140B2 (en) * | 2015-03-27 | 2020-05-12 | Intel Corporation | Control-flow integrity with managed code and unmanaged code |
US10747511B2 (en) | 2015-04-28 | 2020-08-18 | Microsoft Technology Licensing, Llc | Compiler optimization of coroutines |
US9823998B2 (en) * | 2015-12-02 | 2017-11-21 | International Business Machines Corporation | Trace recovery via statistical reasoning |
US10379824B2 (en) * | 2016-02-26 | 2019-08-13 | Oracle International Corporation | Method for static security enforcement of a DSL |
US10140456B2 (en) | 2016-06-08 | 2018-11-27 | Salesforce.Com, Inc. | Runtime analysis of software security vulnerabilities |
US10380347B2 (en) | 2016-06-08 | 2019-08-13 | Salesforce.Com., Inc. | Hierarchical runtime analysis framework for defining vulnerabilities |
US10241890B2 (en) | 2016-07-28 | 2019-03-26 | Salesforce.Com, Inc. | Hybrid code modification in intermediate language for software application |
US10223528B2 (en) * | 2016-09-27 | 2019-03-05 | Intel Corporation | Technologies for deterministic code flow integrity protection |
US10896253B2 (en) * | 2017-02-06 | 2021-01-19 | Huawei Technologies Co., Ltd. | Processor trace-based enforcement of control flow integrity of a computer system |
SG10201701541SA (en) * | 2017-02-27 | 2018-09-27 | Huawei Int Pte Ltd | Device and method for reinforcing control flow integrity of software application |
EP3413532A1 (en) * | 2017-06-07 | 2018-12-12 | Hewlett-Packard Development Company, L.P. | Monitoring control-flow integrity |
CN109670312A (zh) | 2017-10-13 | 2019-04-23 | 华为技术有限公司 | 安全控制方法及计算机*** |
CN107967426B (zh) * | 2017-11-27 | 2020-07-03 | 华中科技大学 | 一种Linux内核数据攻击的检测方法、防御方法及*** |
RU2697948C1 (ru) | 2018-04-19 | 2019-08-21 | Акционерное общество "Лаборатория Касперского" | Система и способ выявления уязвимостей с использованием перехвата вызовов функций |
US10521207B2 (en) * | 2018-05-30 | 2019-12-31 | International Business Machines Corporation | Compiler optimization for indirect array access operations |
WO2020000173A1 (en) * | 2018-06-26 | 2020-01-02 | Nokia Technologies Oy | Method and apparatus for attestation |
CN108983758B (zh) * | 2018-08-23 | 2020-03-24 | 深圳市鹏巨术信息技术有限公司 | 一种汽车诊断设备的软件防护方法、装置及终端 |
JP2022502723A (ja) | 2018-10-18 | 2022-01-11 | スターナム リミテッドSternum Ltd. | スタック破損のエクスプロイトに対する中間コードファイルにおけるセキュリティ緩和手段の適用 |
US10545850B1 (en) | 2018-10-18 | 2020-01-28 | Denso International America, Inc. | System and methods for parallel execution and comparison of related processes for fault protection |
US10657025B2 (en) | 2018-10-18 | 2020-05-19 | Denso International America, Inc. | Systems and methods for dynamically identifying data arguments and instrumenting source code |
US11036866B2 (en) | 2018-10-18 | 2021-06-15 | Denso Corporation | Systems and methods for optimizing control flow graphs for functional safety using fault tree analysis |
US10628286B1 (en) | 2018-10-18 | 2020-04-21 | Denso International America, Inc. | Systems and methods for dynamically identifying program control flow and instrumenting source code |
IL273068B2 (en) * | 2018-10-29 | 2024-06-01 | Sternum Ltd | Variable memory protection |
JP2022527266A (ja) | 2019-03-25 | 2022-06-01 | オーロラ ラブズ リミテッド | コード行挙動および関係モデルの発生ならびに署名 |
CN110347954B (zh) * | 2019-05-24 | 2021-06-25 | 因特睿科技有限公司 | 面向复杂Web应用的服务化方法 |
US11580234B2 (en) | 2019-06-29 | 2023-02-14 | Intel Corporation | Implicit integrity for cryptographic computing |
US20200257827A1 (en) * | 2019-06-29 | 2020-08-13 | Intel Corporation | Memory write for ownership access in a core |
US10909042B1 (en) * | 2019-07-19 | 2021-02-02 | Cylance Inc. | Prevention of hash-based API importing |
CN110717181B (zh) * | 2019-09-09 | 2021-07-02 | 中国人民解放军战略支援部队信息工程大学 | 基于新型程序依赖图的非控制数据攻击检测方法及装置 |
US20220019656A1 (en) * | 2020-07-17 | 2022-01-20 | Blackberry Limited | Using a variable write profile for detecting intrusion of a computer program |
CN112966258B (zh) * | 2021-03-22 | 2022-12-30 | 西安电子科技大学 | 控制流完整性保护方法、***、装置及可读存储介质 |
US12056112B2 (en) | 2021-05-28 | 2024-08-06 | Bank Of America Corporation | Data feed meta detail categorization for confidence |
US12050587B2 (en) | 2021-05-28 | 2024-07-30 | Bank Of America Corporation | Data feed meta detail categorization for confidence |
CN114707143B (zh) * | 2022-03-15 | 2024-08-09 | 中国科学院信息工程研究所 | 内存数据损坏攻击的监测方法和装置 |
CN115795489B (zh) * | 2023-02-09 | 2023-05-09 | 中国电子科技集团公司第三十研究所 | 一种基于硬件级进程跟踪的软件漏洞静态分析方法及装置 |
CN116450402B (zh) * | 2023-06-15 | 2023-08-18 | 北京智芯微电子科技有限公司 | 程序流监控方法、编译方法、装置、处理器及计算机设备 |
Family Cites Families (35)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4558176A (en) * | 1982-09-20 | 1985-12-10 | Arnold Mark G | Computer systems to inhibit unauthorized copying, unauthorized usage, and automated cracking of protected software |
US4920538A (en) | 1985-06-28 | 1990-04-24 | International Business Machines Corporation | Method of checking the execution of microcode sequences |
US5477858A (en) * | 1986-07-30 | 1995-12-26 | Siemens Medical Systems, Inc. | Ultrasound blood flow/tissue imaging system |
US5421006A (en) | 1992-05-07 | 1995-05-30 | Compaq Computer Corp. | Method and apparatus for assessing integrity of computer system software |
FR2700032B1 (fr) | 1992-12-31 | 1995-02-10 | Alsthom Gec | Procédé de détection des erreurs d'exécution d'un logiciel. |
US7301541B2 (en) * | 1995-08-16 | 2007-11-27 | Microunity Systems Engineering, Inc. | Programmable processor and method with wide operations |
US5826013A (en) * | 1995-09-28 | 1998-10-20 | Symantec Corporation | Polymorphic virus detection module |
US6247036B1 (en) * | 1996-01-22 | 2001-06-12 | Infinite Technology Corp. | Processor with reconfigurable arithmetic data path |
US5867647A (en) * | 1996-02-09 | 1999-02-02 | Secure Computing Corporation | System and method for securing compiled program code |
US6416154B1 (en) * | 1997-07-12 | 2002-07-09 | Silverbrook Research Pty Ltd | Printing cartridge with two dimensional code identification |
EP2241968B1 (en) * | 1998-08-24 | 2012-06-27 | MicroUnity Systems Engineering, Inc. | System with wide operand architecture, and method |
US6286075B1 (en) * | 1998-11-16 | 2001-09-04 | Infineon Technologies Ag | Method of speeding up access to a memory page using a number of M page tag registers to track a state of physical pages in a memory device having N memory banks where N is greater than M |
US6802006B1 (en) | 1999-01-15 | 2004-10-05 | Macrovision Corporation | System and method of verifying the authenticity of dynamically connectable executable images |
FR2790844B1 (fr) | 1999-03-09 | 2001-05-25 | Gemplus Card Int | Procede et dispositif de surveillance du deroulement d'un programme, dispositif programme permettant la surveillance de son programme |
EP1197492B1 (en) | 1999-06-29 | 2007-09-05 | Nihon Nohyaku Co., Ltd. | Pyrazole derivatives and process for producing the same, and pesticides containing the same as the active ingredient |
JP2004501407A (ja) | 1999-10-25 | 2004-01-15 | フィーニックス テクノロジーズ リミテッド | 呼出し元アドレスを使用した安全なソフトウェアsmiディスパッチング |
US6775780B1 (en) | 2000-03-16 | 2004-08-10 | Networks Associates Technology, Inc. | Detecting malicious software by analyzing patterns of system calls generated during emulation |
US7089428B2 (en) * | 2000-04-28 | 2006-08-08 | Internet Security Systems, Inc. | Method and system for managing computer security information |
US6981279B1 (en) | 2000-08-17 | 2005-12-27 | International Business Machines Corporation | Method and apparatus for replicating and analyzing worm programs |
CA2319888A1 (en) * | 2000-09-18 | 2002-03-18 | Ibm Canada Limited-Ibm Canada Limitee | Method for generating instruction sequences for integer multiplication |
US6931548B2 (en) | 2001-01-25 | 2005-08-16 | Dell Products L.P. | System and method for limiting use of a software program with another software program |
US20030115479A1 (en) * | 2001-12-14 | 2003-06-19 | Jonathan Edwards | Method and system for detecting computer malwares by scan of process memory after process initialization |
WO2003058451A1 (en) | 2002-01-04 | 2003-07-17 | Internet Security Systems, Inc. | System and method for the managed security control of processes on a computer system |
US7051322B2 (en) * | 2002-12-06 | 2006-05-23 | @Stake, Inc. | Software analysis framework |
WO2004055634A2 (en) | 2002-12-12 | 2004-07-01 | Finite State Machine Labs, Inc. | Systems and methods for detecting a security breach in a computer system |
US20050108562A1 (en) * | 2003-06-18 | 2005-05-19 | Khazan Roger I. | Technique for detecting executable malicious code using a combination of static and dynamic analyses |
EP1507185A1 (fr) | 2003-08-11 | 2005-02-16 | Axalto S.A. | Méthode et dispositif de protection contre l'accès non-autorisé à une routine sensible |
US7716495B2 (en) | 2003-12-31 | 2010-05-11 | Microsoft Corporation | Protection against runtime function attacks |
US8627458B2 (en) * | 2004-01-13 | 2014-01-07 | Mcafee, Inc. | Detecting malicious computer program activity using external program calls with dynamic rule sets |
US7523498B2 (en) | 2004-05-20 | 2009-04-21 | International Business Machines Corporation | Method and system for monitoring personal computer documents for sensitive data |
US7596809B2 (en) | 2004-06-14 | 2009-09-29 | Lionic Corporation | System security approaches using multiple processing units |
US7581253B2 (en) | 2004-07-20 | 2009-08-25 | Lenovo (Singapore) Pte. Ltd. | Secure storage tracking for anti-virus speed-up |
US7962901B2 (en) * | 2006-04-17 | 2011-06-14 | Microsoft Corporation | Using dynamic analysis to improve model checking |
KR100835173B1 (ko) * | 2006-09-20 | 2008-06-05 | 한국전자통신연구원 | 곱셈 누적 연산을 위한 디지털 신호처리 장치 및 방법 |
US7840849B2 (en) * | 2006-12-21 | 2010-11-23 | Novell, Inc. | Methods and apparatus for debugging software including divisions of an execution history of a debuggee program |
-
2006
- 2006-06-23 EP EP06116006.5A patent/EP1870829B1/en active Active
-
2007
- 2007-05-04 US US12/306,188 patent/US9390261B2/en active Active
- 2007-05-04 KR KR1020097000952A patent/KR20090033228A/ko not_active Application Discontinuation
- 2007-05-04 CN CNA2007800233527A patent/CN101473300A/zh active Pending
- 2007-05-04 WO PCT/US2007/010849 patent/WO2008002350A1/en active Application Filing
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR102132933B1 (ko) * | 2019-09-09 | 2020-07-10 | 국방과학연구소 | 소프트웨어의 제어 흐름 보호장치 및 그 방법 |
Also Published As
Publication number | Publication date |
---|---|
CN101473300A (zh) | 2009-07-01 |
US9390261B2 (en) | 2016-07-12 |
WO2008002350A1 (en) | 2008-01-03 |
EP1870829B1 (en) | 2014-12-03 |
US20090282393A1 (en) | 2009-11-12 |
EP1870829A1 (en) | 2007-12-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP1870829B1 (en) | Securing software by enforcing data flow integrity | |
Duck et al. | Stack Bounds Protection with Low Fat Pointers. | |
Haller et al. | TypeSan: Practical type confusion detection | |
Akritidis et al. | Preventing memory error exploits with WIT | |
Castro et al. | Securing software by enforcing data-flow integrity. | |
Evans et al. | Control jujutsu: On the weaknesses of fine-grained control flow integrity | |
Jeon et al. | Hextype: Efficient detection of type confusion errors for c++ | |
Hasabnis et al. | Light-weight bounds checking | |
US8434064B2 (en) | Detecting memory errors using write integrity testing | |
Anand et al. | A compiler-level intermediate representation based binary analysis and rewriting system | |
Borrello et al. | Constantine: Automatic side-channel resistance using efficient control and data flow linearization | |
Reps et al. | Intermediate-representation recovery from low-level code | |
Richardson | Complete spatial safety for C and C++ using CHERI capabilities | |
Dewey et al. | Uncovering use-after-free conditions in compiled code | |
Huang et al. | The taming of the stack: Isolating stack data from memory errors | |
Larsen et al. | The Continuing Arms Race: Code-Reuse Attacks and Defenses | |
Lehmann et al. | Fuzzm: Finding memory bugs through binary-only instrumentation and fuzzing of webassembly | |
Trabish et al. | Relocatable addressing model for symbolic execution | |
Gutstein | Memory safety with CHERI capabilities: security analysis, language interpreters, and heap temporal safety | |
Zhu et al. | Scalable static detection of use-after-free vulnerabilities in binary code | |
Liljestrand et al. | Color My World: Deterministic Tagging for Memory Safety | |
Zhang et al. | Cape: compiler-aided program transformation for htm-based cache side-channel defense | |
Hiser et al. | Meds: The memory error detection system | |
Lu | Securing software systems by preventing information leaks. | |
Huang et al. | Top of the heap: Efficient memory error protection for many heap objects |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
WITN | Application deemed withdrawn, e.g. because no request for examination was filed or no examination fee was paid |