프로그램 분석
Program analysis시리즈의 일부 |
소프트웨어 개발 |
---|
컴퓨터 과학에서 프로그램[1] 분석이란 정확성, 견고성, 안전성 및 활성과 같은 속성에 관한 컴퓨터 프로그램의 동작을 자동으로 분석하는 과정입니다.프로그램 분석은 프로그램 최적화와 프로그램 정확성의 두 가지 주요 영역에 초점을 맞춥니다.첫 번째는 자원 사용을 줄이면서 프로그램의 성능을 향상시키는 데 초점을 맞추고, 후자는 프로그램이 원래 해야 할 일을 확실하게 수행하도록 하는 데 초점을 맞추고 있습니다.
프로그램 분석은 프로그램을 실행하지 않고(정적 프로그램 분석), 런타임 중(동적 프로그램 분석) 또는 둘 다 조합하여 수행할 수 있습니다.
정적 프로그램 분석
프로그램의 정확성 측면에서 정적 분석을 통해 프로그램 [2]개발 단계에서 취약성을 발견할 수 있습니다.이러한 취약성은 정적 분석이 취약성의 근본으로 이어지기 때문에 테스트 단계에서 발견된 취약점보다 수정이 쉽습니다.
많은 형태의 정적 분석이 계산적으로 불가능하기 때문에, 그것을 실행하는 메커니즘은 항상 올바른 답변으로 끝나는 것은 아닙니다.이것은, 때로는 잘못된 부정(실제로 코드가 문제가 있는 경우는 발견되지 않는다) 또는 잘못된 긍정(false positive)을 반환하거나, 혹은 잘못된 답을 반환하지 않고, 때로는 n을 반환하기 때문입니다.종료합니다.이러한 제한에도 불구하고 첫 번째 유형의 메커니즘은 취약성의 수를 줄일 수 있으며 두 번째 유형은 때때로 특정 등급의 취약성의 결여를 강력하게 보장할 수 있다.
잘못된 최적화는 매우 바람직하지 않습니다.따라서 프로그램 최적화의 맥락에서 계산적으로 결정할 수 없는 분석을 처리하기 위한 두 가지 주요 전략이 있습니다.
- 최적화 컴파일러의 옵티마이저와 같이 비교적 짧은 시간 내에 완료될 것으로 예상되는 옵티마이저는 한정된 시간 내에 완료가 보증되고 올바른 최적화만을 찾을 수 있는 잘린 버전의 분석을 사용할 수 있습니다.
- 서드파티 최적화 툴은 잘못된 최적화가 발생하지 않도록 구현될 수 있습니다.또한 상황에 따라서는 그 최적화 툴이 검출될 때까지 무기한 실행을 계속할 수도 있습니다(이는 발생하지 않을 수도 있습니다).이 경우 툴을 사용하는 개발자는 툴을 정지하고 해당 코드에서 툴을 다시 실행하는 것을 피해야 합니다(또는 툴이 걸리지 않도록 코드를 수정해야 합니다).
그러나 C와 같이 완전히 지정되지 않은 언어에 적용할 수 있는 세 번째 전략도 있습니다.최적화 컴파일러는 사용 중인 언어 표준에서 의미론이 지정되지 않은 소스 코드를 발견하면 런타임에 어떤 작업도 수행하는 코드를 자유롭게 생성할 수 있습니다.
제어 흐름
제어 흐름 분석의 목적은 프로그램 실행 중 다양한 지점에서 호출할 수 있는 함수에 대한 정보를 얻는 것입니다.수집된 정보는 제어 흐름 그래프(CFG)로 표시됩니다.여기서 노드는 프로그램의 명령이고 에지는 제어 흐름을 나타냅니다.코드 블록과 루프를 식별함으로써 CFG는 컴파일러에 의한 최적화의 출발점이 됩니다.
데이터 흐름 분석
데이터 흐름 분석은 프로그램의 각 지점의 값 및 값에 대한 정보를 수집하기 위해 설계된 기술입니다.이 기술은 코드를 최적화하기 위해 컴파일러에 의해 자주 사용됩니다.데이터 흐름 분석의 가장 잘 알려진 예 중 하나는 오염 검사입니다. 이 검사는 사용자 제공 데이터를 포함하는 모든 변수(즉, "오염된" 것으로 간주됨)를 고려하고 이러한 변수가 삭제될 때까지 사용되지 않도록 합니다.이 기술은 SQL 주입 공격을 방지하기 위해 자주 사용됩니다.오염 검사는 정적 또는 동적으로 수행할 수 있습니다.
추상적 해석
추상적 해석은 프로그램을 실제로 실행하지 않고 프로그램의 실행 가능성에 대한 정보를 추출할 수 있도록 한다.이 정보는 컴파일러가 가능한 최적화를 찾거나 특정 버그에 대한 프로그램을 인증하기 위해 사용할 수 있습니다.
유형 시스템
특정 요건을 충족하는 프로그램에 유형을 연결합니다.그 목적은 속성에 따라 올바른 것으로 간주되는 언어의 프로그램 서브셋을 선택하는 것입니다.
- 유형 확인 – 프로그램이 유형 시스템에서 허용되는지 확인합니다.
유형 확인은 프로그래밍 객체의 사용 방법과 사용할 수 있는 작업을 제한하기 위해 프로그래밍에서 사용됩니다.이것은 컴파일러 또는 인터프리터에 의해 실행됩니다.또한 유형 검사를 통해 서명된 값이 서명되지 않은 변수에 속하지 않도록 함으로써 취약성을 방지할 수 있습니다.유형 확인은 정적(컴파일 시), 동적(런타임 시) 또는 두 가지를 조합하여 수행할 수 있습니다.
정적 유형 정보(유추 또는 소스 코드의 유형 주석을 통해 명시적으로 제공됨)를 사용하여 박스형 어레이를 박스형 어레이로 교체하는 등의 최적화를 수행할 수도 있습니다.
효과 시스템
효과 시스템은 기능 또는 방법을 실행하는 것이 가질 수 있는 효과를 나타내도록 설계된 공식 시스템입니다.효과는 수행 중인 작업과 수행 중인 작업을 코드화합니다. 일반적으로 각각 효과 [clarification needed]종류와 효과 영역이라고 합니다.
모델 체크
모델 체크는 모델(이 컨텍스트에서는 코드 조각의 정식 모델을 의미하지만 다른 컨텍스트에서는 하드웨어 조각의 모델이 될 수 있음)이 특정 사양에 부합하는지 확인하는 엄격하고 형식적이며 자동화된 방법을 말합니다.코드 고유의 유한 상태 특성 및 규격과 코드 모두 논리식으로 변환할 수 있기 때문에 효율적인 알고리즘 방법을 사용하여 시스템이 규격을 위반하는지 여부를 확인할 수 있다.
동적 프로그램 분석
동적 분석은 프로그램의 런타임 지식을 사용하여 분석의 정밀도를 높이는 동시에 런타임 보호를 제공할 수 있지만, 문제의 실행을 한 번만 분석할 수 있으며 런타임 검사로 인해 프로그램의 성능이 저하될 수 있습니다.
테스트
소프트웨어의 품질과 신뢰성이 높은 방법으로 동작하는 것을 확인하고, 동시에 동작하는 다른 소프트웨어와의 경합을 일으키지 않도록 테스트해야 합니다.테스트는 입력으로 프로그램을 실행하고 동작과 생성된 출력을 평가하여 수행됩니다.보안 요건이 지정되지 않은 경우에도 공격자가 소프트웨어를 조작하거나 정보를 훔치거나 소프트웨어의 정상적인 동작을 방해하거나 사용자를 공격하는 피벗으로 사용하지 못하도록 보안 테스트를 추가로 수행해야 합니다.
감시
프로그램 모니터링은 프로그램에 대한 다양한 종류의 정보(리소스 사용, 이벤트, 상호작용 등)를 기록하고 기록하므로 이상 동작의 원인을 확인하거나 특정할 수 있습니다.또, 시큐러티 감사를 실시하기 위해서도 사용할 수 있습니다.프로그램의 자동 모니터링은 런타임 검증이라고도 합니다.
프로그램 슬라이스
프로그램 동작의 특정 서브셋에 대해 프로그램 슬라이싱은 선택된 동작을 생성하는 최소한의 형태로 프로그램을 축소하는 것으로 구성됩니다.축소된 프로그램은 "슬라이스"라고 불리며 지정된 동작 서브셋의 도메인 내에서 원래 프로그램의 충실한 표현입니다.일반적으로 슬라이스를 찾는 것은 해결할 수 없는 문제이지만 변수 집합의 값으로 목표 동작 서브셋을 지정함으로써 데이터 흐름 알고리즘을 사용하여 대략적인 슬라이스를 얻을 수 있습니다.이러한 슬라이스는 보통 개발자가 디버깅 중에 오류의 원인을 찾기 위해 사용합니다.
「 」를 참조해 주세요.
레퍼런스
추가 정보
- Agrawal, Hiralal; Horgan, Joseph R. Dynamic program slicing (PDF).
- Chunlei, Wang; Gang, Zhao; Yiqi, Dai (2009). "An Efficient Control Flow Security Analysis Approach for Binary Executables". 2009 2nd IEEE International Conference on Computer Science and Information Technology. pp. 272–276. doi:10.1109/ICCSIT.2009.5234950. ISBN 978-1-4244-4519-6.
- Nielson, Flemming; Nielson, Hanne Riis; Hankin, Chris (2005). Principles of Program Analysis. Springer Science+Business Media.