KR20140053756A - 어플리케이션을 보호하기 위한 링크와 로드 방법 - Google Patents

어플리케이션을 보호하기 위한 링크와 로드 방법 Download PDF

Info

Publication number
KR20140053756A
KR20140053756A KR1020127028136A KR20127028136A KR20140053756A KR 20140053756 A KR20140053756 A KR 20140053756A KR 1020127028136 A KR1020127028136 A KR 1020127028136A KR 20127028136 A KR20127028136 A KR 20127028136A KR 20140053756 A KR20140053756 A KR 20140053756A
Authority
KR
South Korea
Prior art keywords
software modules
instances
compiled software
random
security
Prior art date
Application number
KR1020127028136A
Other languages
English (en)
Inventor
그랜트 스튜어트 구디스
클리포드 리엠
Original Assignee
어데토 캐나다 코포레이션
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 어데토 캐나다 코포레이션 filed Critical 어데토 캐나다 코포레이션
Publication of KR20140053756A publication Critical patent/KR20140053756A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/51Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems at application loading time, e.g. accepting, rejecting, starting or inhibiting executable software based on integrity or source reliability
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/54Link editing before load time

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Technology Law (AREA)
  • Multimedia (AREA)
  • Stored Programmes (AREA)
  • Storage Device Security (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

링커 또는 로더 및 관련 방법은 예를 들면 메모리 재배치, 모듈의 다이버스 인스턴스의 선별, 상수의 후기 바인딩을 통하여 목적코드 모듈들로의 보안성 변환의 상기 어플리케이션이 링크 또는 로드 타임까지 연기될 수 있음을 나타낸다. 이는 기존의 소스 간 보안성 변환들을 넘어서는 여러 이점들을 제공한다. 이러한 연기된 보안성 변환들은 매우 가벼운 방식으로 적용될 수 있어서 작업 수행 및 정확성에 있어서 상기 충격을 최소화하고 디버그의 상기 복잡성을 감소시키는 동시에 보안성을 향상시키면서 상기 실행 프로그램의 다양성을 위한 많은 기회들을 설정할 수 있다.

Description

어플리케이션을 보호하기 위한 링크와 로드 방법{METHOD FOR LINKING AND LOADING TO PROTECT APPLICATIONS}
본 발명은 암호화에 관한 것으로서, 보다 상세하게는, 어플리케이션을 보호하는 방법에 관한 것이다.
기존에는 특정한 소프트웨어 모듈(module)의 보안성 변환은 직접적으로 소스 코드(source code)에 적용되었다. 예를 들면, 프로그램의 변환은 소프트웨어를 공격하기 리버스 엔지니어링(reverse engineering)과 탬퍼링 공격(tempering attack)에 저항하기 위한 효과적인 접근법을 보여준다. 또한, 이러한 보안성 변환은 시간차 공격(differential attack), 공모(collusion), 다른 유사한 방법들의 장벽이 된다. 예를 들어, 2003년 7월 15일 출원된 미국 특허 제 6,594,761호, 2005년 1월 11일 출원된 미국 특허 제 6,842,862호, 2004년 8월 17일 출원된 미국 특허 제 6,779,114호는 제어 흐름 변환 기술이 소프트웨어를 보호할 수 있다고 개시되어 있다.
상기 보안성 변환은 한 번 적용되면, 상기 소스 파일들은 먼저 소프트웨어 모듈의 프리 컴파일러(pre-complier)에 의해 작동되고, 사용자에 의한 보안성의 결정에 기초하여 변환된 소스파일들을 생성하여 소스간(source to source) 보안성을 변환한다. 상기 변환된 소스파일들은 먼저 목적 코드(object-code)를 생성하는 상기 네이티브 컴파일러(native complier)에 의해 작업된다. 상기 네이티브 목적 코드의 결과(아마도 정적 라이브러리(static library)패키지)는 최종사용자까지는 불변되고, 링커(linker)에 의해 실행 바이너리(binary) 또는 동적 라이브러리(dynamic library)를 생성하도록 진행된다. 라이브러리들은 링커에 의해 프로그램으로 통합된다. 상기 링커의 아웃풋은(특히, 메모리에서 소프트웨어 모듈의 레이아웃) 자동적으로 생성되어 인풋 소프트웨어의 결정기능(deterministic function)이 되고, 런타임 작동에 최적화된다. 만약 메모리 레이아웃을 수정하고자 하면, 대부분의 링커들은 일반적으로 일반사용자의 범위를 넘어선 고급사용자가 사용하는 복잡한 메타데이타의 사용이 요구된다.
만약 소프트웨어 모듈의 보안성 결정이 재고되어야 한다면, 모듈의 다이버스(diverse) 인스턴스(instance)들의 생성이 요구될지라도, 프리 컴파일링(pre-compiling), 컴파일링(compiling), 링킹(linking), 로딩(loading)의 단계를 반복할 수 밖에 없다. 이 경우 빌드 시간(build time)이 포함된다 하더라도 질적으로 봤을 때도 이는 비싸다. 소프트웨어 모듈을 재구축(rebuild)할 때는 작업(속도, 크기, 등)들과 실행/동적 라이브러리(dynamic-library)의 정확성이 확인되어야 할 것이다.
따라서 보안성 결정들이 변화되어야 할 필요가 있거나, 다이버스(diverse) 인스턴스들이 설정되어야할 필요가 있을 때와 같이 소프트웨어 모듈을 재구축할 필요성을 배제하는 보안성 변환을 적용하는 향상된 방법과 시스템을 제공하는 것이 바람직하다.
본 발명은 여러가지 방법으로 바이너리(binary) 아웃풋 코드의 내용을 수정할 수 있고, 실행/동적 라이브러리의 다양성을 통하여 보안성을 부여하는 모든 소프트웨어 링커 또는 소프트웨어 로더를 제공한다. 특정한 세 가지 실행예가 설명된다. 첫 번째는 메모리 영상의 이동을 포함한다. 상기 링커의 결과는 재배치가능코드(relocatable code)의 각 분야나 구획에서, 기존의 링커들에 의한 확정적 결정(deterministic decision)과는 반대로, 임의 추출된 베이스 어드레스(base-address)의 배정 및 레이아웃이 될 수 있다. 이런 노력은 구획에서의 예측가능한 위치에 기초한 공격에 대한 상당한 장벽이 될 수 있다. 두 번째는 선별적인 구축을 포함한다. 개별 코드(individual code) 모듈은 대용량의 라이브러리(container library)에서 복수의 다이버스(diverse) 형태로 분리되어 프로비저닝될 수 있다. 상기 링커는 최종 실행을 위하여 무작위로 코드 인스턴스들을 선택할 것이다. 이런 노력은 시간차 공격을 좌절시킬 수 있다. 세 번째는 상수들의 후기 바인딩(late binding)을 포함한다. 데이터와 제어 흐름 보안 변환과 같은 프로그램 변환은, 선택된 상수들을 통해 특징되는 작동 파라미터를 가진다. 이러한 파라미터들은 어드레스(address)의 이동, 링크 시간의 선택, 실행시간의 변환의 다변화 등을 처리한다. 이런 노력은 역시 시간차 공격 대항하여 사용할 수 있고 또한 조직된 업데이트를 통해서 갱신될 수도 있다.
상기 링커나 로더는 이러한 작동의 범위를 조절할 컨디션들과, 예측가능한 다이버스(diverse) 아웃풋 영상의 설정을 가능케 하는 랜덤시드(random-seed) 파라미터를 승인한다. 따라서 만약 상기 링커가 정확히 같은 인풋 소프트웨어 모듈들 및 동일한 랜덤 시드(random-seed)로 두 번 작동되면, 상기 아웃풋 영상도 동일할 것이다. 다이버스(diverse) 아웃풋 영상들을 생성하기 위하여 개별 랜덤 시드들이 선택되어져야 할 것이다.
첫 번째 측면으로서 빌드 시간(build time)이나 로드 시간(load time)에 목적코드로 보안성 변환을 적용하는 방법이 제공될 것이다. 상기 방법은 가상의 무작위 숫자의 생성기 입력용으로서 램덤시드를 명시하는 것을 포함한다. 복수의 컴파일드 소프트웨어 모듈들의 개별 인스턴스들의 집합으로부터 복수의 소프트웨어 모듈들의 인스턴스들을 무작위 선정하여 상기 컴파일드 소프트웨어 모듈들의 선정된 인스턴스들의 무작위 레이아웃을 결정하는 가상의 무작위 숫자 생성기를 상기 랜덤시드로 적용함으로써 복수의 컴파일드 소프트웨어 모듈들에 대한 다변화 작업이 적용되어 실행 모듈과 실행 프로그램 영상의 개별 인스턴스가 생성된다. 선정된 컴파일드 소프트웨어 모듈의 인스턴스(instance)들은 실행한 모듈의 별개 인스턴스를 생성하기 위하여 무작위 레이아웃에 따라서 결합된다. 실행 모듈의 별개 인스턴스 내의 심볼은 해결된다.
나아가, 복수의 실행 프로그램 영상들의 다이버스(diverse) 인스턴스들을 생성하는 방법들이 제공된다. 원하는 실행 프로그램 영상의 인스턴스를 위해서 랜덤 시드는 가상의 무작위 숫자의 생성기의 인풋으로 명시된다. 실행 프로그램 영상의 별개 인스턴스는 복수의 컴파일드 소프트웨어 모듈들에 대한 다변화 작업을 적용하여 생성된다. 상기 작업은 랜덤시드를 가상의 무작위 숫자 생성기에 입력하여 각 복수의 컴파일드 소프트웨어 모듈들의 별개 인스턴스들의 집합으로부터 각 복수의 컴파일드 소프트웨어 모듈들의 인스턴스들을 무작위 선택하여, 상기 컴파일드 소프트웨어 모듈들의 선정된 인스턴스들을 무작위 레이아웃을 결정하도록 한다. 상기 컴파일드 소프트웨어 모듈들에서 선정된 인스턴스들은 무작위 레이아웃에 따라서 실행 프로그램 영상의 개별 인스턴스들을 생성하기 위하여 결합한다. 상기 실행 프로그램 영상의 개별 인스턴스 내의 심볼은 해결된다.
상기 무작위 선정은 복수의 인스텐시에티드(instantiated) 모듈들을 포함하여 다양하게 프로비저닝된 라이브러리로부터 무작위로 선정하는 것을 포함할 수 있다. 상기 다양하게 프로비저닝된 라이브러리 내 인스텐시에티드(instantiated) 모듈은 확실한 보안 특성으로 예시될 수 있고, 무작위로 선정은 복수의 컴파일드 소프트웨어 모듈들의 어셋(asset) 순위와 콜 사이트들을 위한 복수의 컴파일드 모듈들 내부에 프로파일 무게들을 내장하고, 상기 어셋(asset) 순위와 프로필 무게에 기초한 무작위 선정을 포함한다.
상기 무작위 레이아웃의 결정하는 것은 상기 컴파일드 소프트웨어 모듈들의 선정된 인스턴스들을 분리된 코드 부분들로 진입시키는 것과, 메모리 영상 내의 상기 코드 부분의 위치를 임의로 정하게 하는 것을 포함할 수 있다. 코드 부분의 위치를 무작위로 배치하는 것은 코드 부분들을 컴파일드 소프트웨어 모듈에서 선정된 다른 인스턴스들을 혼합하거나, 컴파일드 소프트웨어 모듈에서 선정된 인스턴스들 중 다른 것들의 코드부분과 데이터 부분을 혼합한 것을 포함할 수 있다.
상기 다변화 작업의 적용은 상기 랜덤시드를 상기 가상의 무작위 숫자 생성기에 입력하여 컴파일드 소프트웨어 모듈들의 선별된 인스턴스들에 적용되는 보안성 변환들의 메타 데이터에 따라 무작위로 상기 보안성 변환상수를 결정하게 하는 보안성 변환 상수들의 후기바인딩을 더 포함할 수 있다.
나아가, 복수의 실행 프로그램 영상들의 다이버스(diverse) 인스턴스들을 생성하는 방법이 제공될 수 있다. 실행 프로그램 영상의 원하는 인스턴스 또는 동적 라이브러리를 얻기 위해서 랜덤 시드가 무작위 선택을 생성하기 위한 가상의 무작위 숫자생성기의 인풋으로 지정된다. 복수의 컴파일드 소프트웨어 모듈들은 다변화 작업을 적용하여 변환되고, 복수의 컴파일드 소프트웨어 모듈들을 무작위로 선택하여 복수의 컴파일드 소프트웨어 모듈들과 관계되는 심볼들을 해결함으로써 결정된다. 따라서 해결된 심볼들에 의해 결정된 개별 환경설정(configuration)을 가지는 실행 프로그램 영상의 인스턴스가 생성된다. 복수의 컴파일드 소프트웨어 모듈들을 변환하는 것은 복수의 소프트웨어 모듈들의 무작위 메모리 영상의 레이아웃을 제공하여 심볼들을 해결하거나, 복수의 소프트웨어 모듈들의 개별 인스턴스들을 무작위로 선정하여 심볼들을 해결하는 것을 포함할 수 있다.
또 다른 한 측면은, 빌드시간(build-time)에 압축된 실행 모듈들의 복수의 다이버스(diverse) 개별 인스턴스들을 제공하는 링커와 로더를 제공하는 것이다. 상기 로더와 링커들은 프로세서가 런타임에 실행 다이버스(diverse) 개별 인스턴스들을 위하여 개별적인 무작위 선택을 생성하도록 설정된 가상의 무작위 숫자 생성기를 포함한다. 이 변환은 다변화 작업을 적용하여 복수의 컴파일드 소프트웨어 모듈들을 변환시켜 이뤄지고, 상기 무작위 선택을 통하여 그것이 결정된다; 복수의 컴파일드 소프트웨어 모듈들과 관련된 심볼의 해결; 및 해결된 심볼들에 의해 프로그램 동작을 할 것인지 결정되는 개별 환경설정(configuration)을 가지는 실행 프로그램 영상들의 인스턴스를 생성하는 것.
또다른 측면에서, 실행 프로그램 영상의 복수의 다이버스(diverse) 인스턴스들을 로더에 생성하게 한다. 상기 로더는 프로세서가 실행 프로그램 영상의 원하는 인스턴스들을 얻기 위해 개별의 무작위 선택을 생성하도록 하는 가상의 무작위 숫자 생성기와; 또한 프로세서가 실행 영상의 개별 인스턴스를 생성하게 하는 런타임(Run-time) 모듈을 포함한다. 복수의 컴파일드 소프트웨어 모듈들의 개별 인스턴스들의 집합으로부터 복수의 컴파일드 소프트웨어 모듈들의 인스턴스들을 무작위 선택하여, 상기 컴파일드 소프트웨어 모듈들의 선정된 인스턴스들의 무작위 레이아웃을 결정하는 복수의 컴파일드 소프트웨어 모듈들에 대한 다변화 작업을 통하여 상기 개별 인스턴스가 생성된다; 또한 실행 프로그램 영상의 개별 인스턴스를 생성하는 무작위 레이아웃에 따라 컴파일드 소프트웨어 모듈들의 설정된 인스턴스들을 결합함으로써 생성되고; 실행 프로그램 영상의 개별 인스턴스 내에서 심볼을 해결함으로써 생성된다. 상기 랜덤 레이아웃은, 예를 들어 런타임(run time)에 랜덤 어드레스 업무를 포함할 수 있다. 복수의 컴파일드된 소프트웨어 모듈들의 인스턴트들의 선별은 승인되지 않은 브리치(breach)를 감지하는 것과 같은, 런타임 컨디션(runtime condition)들에 기초할 수 있다.
본 발명의 다른 측면들과 형태들은 본 발명의 기술 분야에서 통상의 지식을 가진 자들에게 아래 첨부되는 수치들과 더불어 본 발명의 특정한 실시예에 대한 설명에 따라 구현될 것이 자명하다.
상기 도면들은 관련된 설명과 함께 본 발명의 일부 원리들을 설명하는 데 기여하도록 예시적인 실시예들을 나타낸다. 첨부된 도면들에 있어서,
도 1은 빌드시간(build-time)에 다양성을 통하여 결과물 바이너리(binary)와 보호의 연결(linking)을 나타낸다.
도 2는 보안성/작업 타겟에 최적화된 믹스캐치 선정을 나타내는 순서도이다.
도 3은 변환 상수들의 후기 바인딩을 나타낸다.
도 4는 런타임 로딩 중 다이버스(diverse) 모듈들을 선정하는 것을 보여준다.
도 5는 런타임 로딩 중 랜덤 어드레스 업무를 나타낸다.
도 6은 동적 라이브러리를 대체되는 다이버스(diverse) 모듈로 구축하는 것을 보여준다.
소프트웨어 모듈의 보안성이 링크나 로드시간까지 연기될 수 있도록 기존의 소스 간(source to source) 보안성 변환을 뛰어넘는 여러 이점을 제공하는 보안성 변환 방법에 관한 것이다. 이러한 거치(deferred) 보안성 변환들은 실행의 이행과 정확도(correctness)의 영향을 최소화하여 디버그의 복잡성(complexity)을 줄이도록 하는 동시에 매우 경량 방식으로 적용되어 실행 프로그램을 다양화하고 보안성을 강화하기 위한 많은 기회들을 설정할 수 있다.
소프트웨어 링커들과 링커 기술은 수 년 동안 존재하여 이전의 컴파일드 소프트웨어 모듈들을 단수의 실행 바이너리(binary) 또는 동적 라이브러리에 결합시키는 기능을 제공하였다. 상기 링커의 주업은 모듈이 메모리 내에 있는지, "수리(fixing up)" 또는 모듈간 어드레스 기준들(서브루틴 호출과 같은)의 이동을 결정하여 정확하게 선택된 메모리 레이아웃이 정해질 수 있도록 컴파일드 소프트웨어 모듈을 단수의 메모리 영상에 결합시키는 것이다(예를 들어, J. Levine, Linkers and Loaders, Morgan Kaufmann Publishers, 2000을 보라). 몇 년간 주된 링커 기술 혁신은 실행을 향상시켜 다른 프로세서들과 실행 시스템을 타겟하여 진보된 프로그래밍 언어를 보완하는 기능을 제공하는 데 한정되었다.
기존의 소프트웨어 링커들은 널리 네이티브 목적(native-object) 코드를 불변의 것으로 처리하여, 인풋 소프트웨어 모듈들을 (목적 코드 양식에서) 단수의 실행 바이너리(binary) 또는 동적 라이브러리로 결합시키기 위해서, 필요한 최소한의 수정조차도 제한되도록 하였다. 링커 또는 링크 에디터는 컴파일러에 의해 생성되는 하나 또는 하나 이상의 목적(object)들을 수행하고, 목적들을 단수의 실행 프로그램에 결합시키는 프로그램이다. 컴퓨터 프로그램들은 보통 몇몇의 부분과 모듈들을 포함한다; 모든 이런 부분들/모듈들은 단수의 목적파일에 포함될 필요가 없어서 이 경우 심볼의 수단으로 나타난다. 일반적으로, 목적 파일은 세 종류의 심볼들을 포함할 수 있다: 다른 모듈들에 의해서 불려지도록 허용되는 정의된 심볼들: 심볼들이 정의되는 곳에서 다른 모듈들을 부르는, 정의되지 않은 심볼들: 목적파일 내에서 내부적으로 이동을 용이하게 하는 데 이용되는, 로컬 심볼들. 프로그램이 복수의 목적파일들을 포함할 때, 상기 링커는 이 파일들을 심볼들을 해결하여 통합된 실행 프로그램으로 결합시킨다.
링커들은 라이브러리라고 불리는, 오브젝트(object)들을 오브젝트(object)들과 서브루틴들의 무리로부터 가져올 수 있다. 어떤 링커들은 아웃풋에서 라이브러리 전체를 포함하지 않는다: 링커들은 오직 다른 목적 파일들과 라이브러리로부터 참조된 심볼들을 포함한다. 링커들은 역시 프로그램의 어드레스 공간에서 오브젝트(object)들을 배열한다. 즉, 코드 특정 베이스 어드레스를 또다른 베이스로 이동시키는 이동코드를 포함한다. 컴파일러는 어디에 오브젝트(object)가 있을지 알지 못하기 때문에, 흔히 수정된 베이스 위치를 추정한다(예를 들어, 0).
기계코드의 재이동, 예를 들어 절대적인 점프들, 로드들, 저장소들의 변경(re-target)을 포함할 수 있다. 링커들에 의한 상기 실행 아웃풋은 최종적으로 메모리에 로드될 때, 실행에 앞서 또다른 재이동 경로를 필요로 한다.
동적 링크는 라이브러리의 서브루틴을 컴파일시간(compile time)에 연결하는 것보다는, 런타임에 어플리케이션 프로그램으로의 로딩을 포함한다; 서브루틴들은 디스크에서 분리된 파일들로 남는다. 최소한의 일만이 링커에 의해 컴파일 시간에 이뤄진다; 라이브러리 루틴들에 프로그램 필요와 색인자 이름(index name), 라이브러리에서의 루틴들의 숫자들을 기록한다. 링크 작업의 대부분은 어플리케이션이 로드되는 시간(load-time) 또는 실행 중(run-time)에 행해지다. 로더로 특정되는, 필수적인 링크하는 기능은 실제로 작동시스템의 기초를 이루는 부분이다. 적당한 때에 상기 로더들은 디스크에서 관계되는 라이브러리들을 찾아서, 관련되는 데이터를 라이브러리로부터 프로세스의 메모리 공간으로 추가한다.
상기 링커가 일반적으로 프로그램을 만드는 마지막 단계로서, 심볼의 해결, 레이아웃 결정, 어드레스 바인딩하는 기존의 작업을 능가하는 기회가 있다. 링크 단계는 클래스 공격들에 저항하는 복수의 다이버스(diverse) 실행들을 결합하는 수단으로 사용되고, 기존의 링커 기술을 재방문하는 기반을 제공한다. 링크시간에서의 다양성을 소개하는 것은 경량의 이점들을 가진다. 엄청나게 많은 다이버스(diverse) 인스턴스들을 정확하게 생성하도록 응용하게 하는, 반복되는 비싼 편집단계는 불필요하다. 인스턴스는 예측가능한 실행을 할 것이다. 코드가 널리 수정되기 때문에(이미 컴파일드된), 이런 종류의 다양성은 작동을 실행하는 동안 변형이 진행되는 것과는 다르다. 이런 종류의 다양성은 다이버스(diverse) 인스턴스의 상기 코드가 모든 다른 다이버스(diverse) 인스턴스들의 형태들을 대표하기 때문에 테스트하는 노력을 감소시킬 것이다: 다이버스(diverse) 인스턴스의 테스트를 통하여 다이버스(diverse) 모두 다른 인스턴스들을 대표할 수 있다.
여기에서는 여러 방법으로 바이너리(binary)의 아웃풋 코드의 내용을 생성할 수 있는 소프트웨어의 링커, 로더, 링크하고 로드하는 관련되는 방법 등, 실행/동적 라이브러리에서의 다양성을 통하여 보안성을 제공하는 모든 것들을 제공한다. 세 가지 특정한 다변화 작업은 설명한 대로 목적 코드에 적용될 수 있다. 다변화 작업은 디자인 요구에 따른 적절한 방법으로 분리되어 적용되거나, 결합될 수 있다. 확장된 링커의 툴링(tooling)은 이러한 작동의 범위를 제어하는 조건을 받아들인다. 따라서 만약 링커가 정확히 동일한 인풋 소프트웨어 모듈, 동일한 시드, 상기 아웃풋 영상에 두 번 적용될 것이다. 다이버스(diverse) 아웃풋 영상들을 생성하기 위해서는 개별 시드가 선택된다.
도 1은 아래에서 세 가지 다변화 작업을 수행하게 하는 보안성 주도의 링커(100)이다: 메모리 이동(102), 다양하게 인스텐시에티드(instantiated) 라이브러리들과 목적 모듈들(106)에 기초하여 선별적인 구축(104), 변환정수들의 후기 바인딩(108), PRNG, 선택적인 보안 타겟들, 작업 통제들과 같은 인풋에 부합하는 모든 것(110). 다변화작업의 결과는 탬퍼링 또는 인풋(110)을 변하게 함으로써 결정되는 아웃풋 영상의 많은 다른 인스턴스들(112)에 저항하는 결과물 바이너리(binary)의 보안성이 향상된 인스턴스(112), 또는 아웃풋 영상이다. 문맥에 따라서, 아웃풋 영상(112)는 실행 프로그램 영상, 메모리 영상, 실행 모듈, 또는 동적 라이브러리로 서술된다.
메모리 영상 이동(Memory Image Relocation)
기존의 링커들은 명령 라인(command-line), 독립성들(다른 모듈들에 참조되는 모듈들)에 기초하여 인풋 소프트웨어 모듈들을 예측하여 아웃풋 메모리 영상에 두었을 것이다. 일반적으로 비슷한 종류의 메모리 부분들, 예를 들어 하나의 메모리 부분의 모든 정수 스트링 데이터(string-data)가 함께 그룹지어질 것이다. 편의(더 간단한 재배치 알고리즘), 디버그의 완화, 캐시(cache) 인근에 저장하기 위하여 실행 영상들이 작동하는 실행 시간(execution-time)을 최대화하기 위하여 작동된다.
도 1을 참조하면, 첫 번째 다변화 작업은 메모리 영상 재배치(102)를 포함한다. 상기 링커의 결과로 상기 링커들에 의해서 된 상기 결정론적 결정(deterministic decision)들과 반대되도록 Ox...A, Ox...F, 등 베이스 어드레스(base-address) 작업을 무작위로 순서를 정할 수 있고, 재배치 코드의 부분 또는 분야를 위한 레이아웃들을 임의로 순서를 정할 수 있다. 이런 노력은 예측가능한 부분의 배치에 기초하여 공격자에 대한 중대한 장벽이 될 수 있다. 링커(100)는 인풋(110)에 기초한 요청에 따라서 상기 PRNG를 위한 시드와 같이, 아웃풋 영상(112)이 완전히 새로운 메모리 영상의 레이아웃을 가지도록 할 수 있고(예를 들어, 재배치 가능한 코드의 부분 또는 분야의 위치는 무작위로 랜덤 시드 파라미터(random seed parameter)에 의하여 결정된다), 또한 메모리 영상을 통하여, 예를 들어 데이터, 코드와 같은 다른 형태의 메모리 부분들을 섞거나(inter-mix) 혼합할 수 있다. 이로써 결정론적 방법으로서 소프트웨어 모듈 내에서 개별 기능으로 코드를 재배치만 할 수 있었던 기존의 링커의 배치 기능이 상기 링커(100)에 자유롭게 코드와 데이터를 혼합하는 기능을 부여함으로써 확장되는 것이다. 데이터와 코드를 혼합하는 것은 IDA Pro™바이너리(binary) 영상 역어셈블러/분석기의 정확한 작업을 막는 역할을 한다.
이상적으로, 실행 아웃풋 영상(112)의 정확한 기능적 작동은 메모리 레이아웃의 모든 다이버스(diverse) 인스턴스들과 동일할 것이다. 처리되지 않은 원래의 작업 실행은 캐쉬의 로컬리티 이슈에 의해서 영향을 받을 것이고 메모리 레이아웃 알고리즘의 적합한 선택을 끝내어 작업 변형을 최소한으로 유지될 수 있다. 결과적으로 작업과 정확성은 메모리 영상의 재배치를 이용할 때 확장된 링커들에 의해 설정된 모든 다이버스(diverse) 인스턴스들에 걸쳐서 유지될 것이다.
선별적 구축(Selective Construction)
기존의 링커는 외부적으로 보이는 개체(entity)(함수들 또는 전역변수들과 같은)는 인풋 소프트웨어 모듈들의 집합에서 반드시 정확히 한 번에 제공되어야 한다. 그렇지 않으면, 상기 개체(entity)는 "다중 정의(multiply defined)"되고, 에러가 생길 것이다. 본 실험의 링커(100)에서 두 번째 다변화 작업은 링크를 "믹스 앤 매치(mix and match)" 또는 각 라이브러리(106) 내의 다양하게 인스텐시에티드(instantiated) 목적 모듈들에 기초한 선별적 구축(104)을 포함한다.
라이브러리(106)들은 복수의 실행 모듈들로 설정될 수 있다. 예를 들면, 다수의 유형, 또는 프로그램 모듈의 인스턴스들(Mod A1, Mod A2,...; Mod B1, Mod B2...; Obj1, Obj2,...)이 설정될 수 있다. 주어진 프로그램 모듈의 인스턴스는 상기 동일한 기능으로 작동된다. 대용량 라이브러리에서 복합적인 다이버스(diverse) 인스턴스들(Mod A1, Mod A2,...; Mod B1, Mod B2...; Obj1, Obj2,...)은 분리되어 프로비저닝될 수 있다. 모든 인스턴스들은 똑같은 기능을 제공하기 때문에, 본 링커(100)는 무작위로 특정 인스턴스들을 최종적으로 실행하도록 선별할 수 있다. 이런 노력은 비교를 통한 정보를 얻고자 시도하는 시간차 공격을 좌절시킨다. 상기 링커(100)는 다시 상기 시드에 의해 결정되는 무작위 선택에 기초하여 주어진 외부적으로 보이는 개체(entity)(보통 function)의 복합적인 다이버스(diverse) 인스턴스들 중의 하나가 선별되는 모드를 지원할 수 있다. 많은 기능들이 많은 다이버스(diverse) 인스턴스들에서 사용가능하면(보안성 변환의 설정으로서), 가능한 다양한 아웃풋 영상의 수는 이러한 기능들과 인스턴스들의 수의 생성물이 된다. 상기 방법은, 인스턴스가 개별 기능들의 상당히 다른 실행을 포함할 수 있기 때문에 다이버스(diverse) 인스턴스들의 큰 수들을 설정하는 엄청난 기회를 제공하고, 하나의 인스턴스를 다른 인스턴스로 역설계(reverse-engineering)하여 얻은 지식을 적용하는 기능을 최소화한다.
복수의 인스턴스들은 시간차 공격을 좌절시키는 다양한 실행을 할 수 있을 뿐만 아니라; 또한 다른 작업 그리고/또는 보안성 특징(인풋(110)을 보라)을 가지도록 설정될 수 있다. 예를 들어, 암호화 해쉬 값을 수행하는 함수는, 상기 링커(100)는 논타임(non-time) 위험지역(critical area) 또는 프로세스에서 많이 보호되지만 좀 더 느린 실행하기 위하여 선택할 수 있다. 위험지역이나 프로세스에서, 상기 링커는 보안성 측면을 높은 작업 실행률과 교환하여(trade-off) 선택할 수 있다. 실행과 알고리즘 정보의 적합한 특성과 결합하는 보안 및 작업 목적의 주어진 올바른 인풋은, 디자인을 고려하여 결정되며, 상기 링커(100)는 기능적 실행과 짜맞추어(mix and match) 상기 제약들을 균형 있게 하는 기회를 가진다.
도 2는 아래와 같이 진행되는 보안성 대 작업성을 균형 있게 하기 위한 최적화 방법이다. 단계(step 200)에서 상기 어플리케이션에서 높은 값 어셋(asset)에 대한 정보를 제공한다. 위험성이 있는 어셋(asset) 대 위험성이 적은 어셋(asset)의 순위를 더하는 단계를 포함한다(예를 들어 어셋(asset) 순위). 이러한 위험 어셋(asset)들의 예들은 포함할 수 있다: 상기 시스템 내의 상기 암호화키, 노드 록킹(node-locking) 계산들, 경영 논리를 포함한다. 단계(step 202)에서는 무게들은 프로파일링에 기초하여 call-cites로 지정될 수 있다. 동적이거나 고정된 소스 단계의 프로파일링은 상기 기능과 기초블록(basic-block) 단계에서 어플리케이션을 위해서 생성된다. 동적 프로파일링이 대체로 선호되지만, 동적 프로파일의 부재시에는 고정식 프로파일링이 소스 단계의 분석기에 의해 호출그래프(call-graph)를 통하여 일순주파수(loop frequency)에 대하여 전파성 측정을 함으로써 생성될 수 있다(예를 들어, 컴파일러 또는 프리컴파일러). 단계(204)에서는, 상기 어셋(asset) 순위와 프로필 무게들은 적합한 목적과 라이브러리 모듈로 구현된다. 예를 들어, 어셋(asset) 순위와 프로필 무게를 포함하여 생성된 정보는 편집 및 라이브러리 설정 단계를 통해 완수되어 라이브러리에서서의 모듈과 관계되는 그 외의 정보(extra information)로 구현될 수 있다. 단계(206)에서는 상기 링커(100)는 내장된 정보를 이용하여 모듈을 선별하고, 제약에 기초한 해결 알고리즘을 이용하여 보안성/작업의 타겟을 최적화 하도록 한다. 제약의 해결(constraint-solving)에 대해 알려진 많은 접근법들이 있다.
변환상수의 후기 바인딩(Late-binding of Transformation Constants)
기존의 소프트웨어 링커들은 링커에 의해 선택된 최종 메모리 영상의 레이아웃에 기초하여 "수리(fix-up)"되는 상기 인풋 네이티브-목적 코드에서의 위치를 확인한다. 다른 소프트웨어 모듈들에서 발견되는 외부적으로 볼 수 있는 심볼들(전역 변수 또는 함수와 같은)을 참조할 수 있다. 이러한 재배치들은 링크 프로세스를 통하여 실제로 수정되는 보통 네이티브 목적 코드의 부분이다. 코드와 데이터에서의 보안성 변환은 특유의 정수를 포함한다. 예를 들어, 데이터 변환들은 데이터 작업과 위치를 대체되는 수학적 공간으로 변환하는 수학적인 매핑 기능의 이용을 포함하며, 그 전체 내용이 2003년 7월 15일 자 미국 특허 출원 제 6,594,761호 및 2005년 1월 11일 자 미국 특허 출원 제 6,842,862호로 참조되어 포함된다. 상기 매핑 기능의 이용을 위하여, 상기 매핑 툴(예를 들어 "트랜스코더")은 이러한 기능들의 집합과 매핑을 위한 많은 특유 상수들을 사용한다. 제어 흐름 변환들은(2004년 8월 17일 자 미국 특허 출원 제 6,779,114호에서 설명하고, 그 전체내용이 참조로서 포함되었다) 주어진 프로그램의 제어 흐름을 새로운 제어 흐름의 형태로 상기 흐름을 제어하는 많은 기능들을 사용하여 보여준다. 이러한 기능들은 또한 선택된 상수의 집합들을 가진다.
상기 경우에, 상기 상수들은 무작위(또한 서로 지속적으로)로 선택된다. 상수들의 집합은 프로그램 인스턴스를 위한 구별 인자가 되어 프로그램이 정확하게 기능하게 한다. 이러한 정수들의 정확한 값들은 변환 함수들의 특징에 기반하여 매핑 툴(예를 들어 트랜스코더)에 의하여 선택된다. 또한, 상수의 변경은 일관된 방식으로 많은 다른 것들을 변경할 것을 요구하기 위하여. 어플리케이션을 통하여 발견되는 상호간에 일관된 방식으로 선별되고 내부적으로 연관되는 많은 보안성 변환 상수들이 있다.
목적 코드, 프로그램 변환에 사용되는 상수들의 후기바인딩에 적용될 수 있는 다변화 작업으로서, 특히 데이터와 제어 흐름 변환이 수행될 수 있다. 이 경우, 상수의 집합들은 지속적으로 함께 작동되고, 그럼에도 불구하고 프로그램 인스턴스에 쓰이는 두 번째 구별 상수를 대표하는 두 번 째 상수의 집합(무작위로 선택된)으로 대체된다. 이러한 상수들은 단순히 어드레스를 재배치하는 데 사용될 수 있고, 링크시간에 선택되어 실행시간(execution-time)에 변환의 다변화를 야기할 수 있다. 이와 같은 수정은 시간차 공격으로부터 보호하여 조직된 업데이트를 통하여 갱신할 수도 있다.
상기 링커는, 기존의 링커들의 재배치 능력에서 유추하여 데이터와 제어 흐름 변환과 같은 프로그램 변환을 위하여 특유 상수 집합을 수정할 수 있다. 이런 집합들은 시드에 의해 개시되는 PRNG(가상의 무작위 숫자 생성기; Pseudo-Random Number Generator)에 의하여 생성된다. 각 집합에서 실행하거나 동적 라이브러리로서 굉장히 다양한 범위를 갖는 상수들의 값들은 매우 크다. 도 3을 참조하면, 링크시간에 정수들을 선별하는 방법이 나타난다. 상기 링커(300)는 복수의 소프트웨어 모듈들(Module A1, Module A2,...)을 프로비저닝(provisioning)하는 라이브러리 A와 교신한다. 소프트웨어 모듈은 보안성 변환의 상기 특징에 대한 정수 부분(302)와 메타데이터(304)를 포함한다. 상기 링커(300)은 우선 모듈을 선택하고(step 310), 선별된 모듈(step 312)와 연관되는 메타데이터(304)를 읽는다. 메타데이터에 기초하여, 상기 결과물 바이너리(binary)(322)(step 316)에서, 상기 링커(300)은 새로운 정수들(step 314)를 선택하여, 상기 정수 부분을 상기 새로운 정수들(step 320)의 집합으로 대체한다.
정수들의 집합이 어플리케이션의 정확한 작동(상기 정수 집합은 주어진 메타데이터에서 수학적인 구속을 만족시키도록 하는)에 영향을 끼치지 않기 때문에, 다이버스(diverse) 인스턴스들을 위한 작업/정확함의 상기 다변화는 간단하다. 정수들의 구속은 정수들의 집합들의 두 번째 구속과 동일한 것으로 예상된다. 링크 시간의 다양한 이러한 형식은 사용자에게 최소한의 부담과 시간차 공격에 대항하는 최대한의 보안성 사이에서의 좋은 교환(trade-off)에 해당한다. 또한 어플리케이션 바이너리(binary)가 주기적으로 특유 상수의 새로운 집합으로 업데이트되는 곳에서, 어떤 공격자도 고정된 바이너리 영상(binary image)을 분석할 수 없도록 어플리케이션을 적합하게 갱신하도록 한다.
런타임 로딩(Run-time Loading)
로더는 런타임(run-time)에 작동되는 링커로서 생각할 수도 있다. 모든 상기의 기술들은 빌드시간(build-time), 로드시간(load-time)에 나타나고, 링크 유형(linking feature)은 또한 런타임에 작동될 수도 있다. 런타임에 이런 유형을 작동하는 이점은 상기 분야에서의 조건에 반응할 뿐만 아니라 다른 보안성 강화 기술들을 삽입하는 기술이다. 로더는 도 4와 5에서 보여진다. 도 5가 런타임에 로딩 중 랜덤 어드레스 업무를 나타내는 반면, 도 4는 모듈들의 다이버스(diverse) 인스턴스들로부터 결과물 바이너리(binary)로 로드할 수 있게 선별하는 것을 보여준다.
도 4의 실시예를 보면,다중의 다이버스(diverse) 소프트웨어 모듈들 인스턴스들(Mod A1, Mod A2, Mod A3, Mod A4...; Mod B1, Mod B2, Mod B3, Mod B4...)은 분리되어 동적 라이브러리 A와 동적 라이브러리 B와 같은 동적 라이브러리에 제공될 수 있다. 상기 인스턴스들은 분리된 실행 요소 또는 기준에 의하여 특징될 수 있다. 예를 들어, 특정한 인스턴스들은 높은 보안 레벨을 가지는 모듈들 Mod A1, Mod A2와 같은 "강력한 보호(Strong Protection)"로서 특징될 수 있고, "빠른(Fast)" 모듈 Mod A3, Mod A4와 같은 실행의 속도에 의하여 특징될 수도 있다.
런타임에 다양성을 제공하기 위해서, 상기 로더(400)은 엔트로피(402)의 런타임 소스 및 다이버스(diverse) 모듈 선별기(404)를 조절하여 가상의 무작위 결정을 하는 가상의 무작위 숫자 생성기(psudo-random number generator; PRNG)를 요구하여 상기 작동을 보장하거나, 런타임 로더의 아웃풋 실행(406)이 작동할 때마다 달라지도록 한다. 상기 런타임 로더(400)는 런타임 조건에 기초하여 동적 라이브러리에서 발견되는 다양한 실행들로부터 선택할 수 있다. 예를 들어, 만약 결함(breach) 관리 모듈이 공격의 발생(예를 들어 상기 프로세스가 대리 실행되고 디버그되는)을 발견하면, 로더에게 신호를 보내 가장 높은 수준의 보안성을 가지게 하여 컴퓨터 기능들을 보호하도록 할 수 있다(예를 들어, 모듈들 Mod A1과 Mod A2, 또는 Mod B1, Mod B2의 임의 배정된 조합). 다른 조건들에 기초하여, 다른 결정들을 할 수 있다. 예를 들어, 상기 어플리케이션이 되풀이하여 작동되면, 위험실행포인트에 도달하지 않았다고 하더라도 상기 로더는 보통 때보다 더 무작위 실행을 로드하도록 선택할 수도 있다. 이러한 방식은 시간차 공격을 지연시켜서 반복성과 예측성에 의존하는 상대편을 좌절시킬 것이다.
도 5의 실시예에서, 소프트웨어 모듈들(Mod A1, Mod A2, Mod A3, Mod A4...; Mod B1, Mod B2, Mod B3, Mod B4...; 및 Mod C1, Mod C2, Mod C3, Mod C4...)의 복수의 다이버스(diverse) 인스턴스들은 다시 동적 라이브러리 A, 동적 라이브러리 B, 동적 라이브러리 C와 같은 동적 라이브러리로 분리되어 프로비저닝될 수 있고 런타임 로더(500)는 다시 다이버스(diverse) 모듈들의 선별기(504)를 조절하여 가상의 무작위 결정을 하게 하는 엔트로피(502)의 런타임 소스와 가상의 가짜 숫자 생성기(PRNG)를 포함할 수 있다. 본 실시예는, 상기 다이버스(diverse) 선별기(seletor) 모듈(504)이 메모리 영상 재배치와 선별적인 구축과 관련하여 상술한대로 기능을 실행할 수 있게 한다. 모듈들의 특정 다이버스(diverse) 모듈들은 선택될 수 있고, 선택된 모듈은 런타임에 로드된 것처럼 랜덤 어드레스로 정해질 수 있다. 실행(506)은 다수의 기능이 동적 라이브러리 모듈로 구성되는 방식으로 구성된다. 모듈들이 실행의 다이버스(diverse) 시간에 로드됨에 따라, 다이버스(diverse) 집합으로부터 선정된 모듈들에 더하여, 상기 모듈들은 또한 메모리 내 랜덤 어드레스로 로드된다. 이는 곧 디버그하거나, 에뮬리에션 세션을 작동하는 상대편에게 커다란 장애물이 된다. 프로그램이 실행됨에 따라 예상치 못한 다이버스(diverse) 모듈이 로드될 뿐만 아니라 모듈의 위치 또한 예측불가능하고 되풀이되지 않게 된다.
동적 라이브러리의 구축(Construction of a Dynamic Library)
동적 라이브러리(예를 들어 윈도우에서의 dll, 리눅스, Mac에서의 dylib)는 보통 네이티브 링커들에 의해 설정되고 실행 영상과 밀접하게 비교될 수 있다. 기존의 동적 개체(entity)에서의 심볼들의 대부분은 상기 라이브러리가 설정되는 시점에 해결된다. 상기 라이브러리가 설정될 때까지는 실행이 준비된다. 반대로, 상기 동적 라이브러리는 작동 전에 실행프로그램으로 로드될 필요가 있다. 상기 로더는 심볼들을 라이브러리의 실행 전에 재위치시킬 기회를 갖는다. 동적 라이브러리에서 모든 해결되지 않은 심볼들은 실행 전에 바로 해결된다. 왜냐하면 상기 라이브러리가 상기 링커에 의해서 설정되어 애매하게 정의된 심볼을 포함할 수 없기 때문이다. 재이동가능한 심볼들의 적은 수와 분리되는 기본적인 실행을 위한 준비이다.
그러나 도 6에서와 같이, 결과물 동적 라이브러리의 구축에 있어서 다이버시티 또한 소개될 수 있다. 동적 라이브러리 설정 메커니즘은 복수의 대체되는 모듈들(예를 들어, 함수들과 데이터들)을 제공한다: AltMod A1, AltMod A2,...; AltMod B1, AltMod B2,... 각 대체되는 모듈들은 상기 각각의 모듈의 원래의 인스턴스들과 선택적 등가물을 나타낸다(Mod A1, Mod A2,...; Mod B1, Mod B2...; Obj1, Obj2,...). 상기 라이브러리의 설정은 상기 결과물 동적 라이브러리(602)에서 대체 모듈을 압축하는 링커(600)를 요구한다. 이는 역시 대체 모듈들을 가리키는 테이블을 취급한다. 그 뒤에, 런타임에 적합하게 실행되는 로더는 대체되고, 다이버스(diverse) 모듈들 사이에서 상기 테이블들에 대해 질문하여 위에서 상세히 설명한 대로 무작위 선택을 만들 수 있다.
이상에서, 설명의 목적으로, 본 발명의 실시예들에 대한 철저한 이해를 제공하기 위하여 다양한 세부적인 내용이 개시되었다. 하지만, 당업자들은 본 발명을 실시하는데 이러한 구체적인 내용들이 요구되지 않는다는 것을 이해할 수 있을 것이다. 다른 경우에서 본 발명이 불명확하게 되지 않도록 잘 알려진 전기적인 구조들 및 회로들이 블록도의 형태로 도시되었다. 예를 들어 여기에 기재된 본 발명의 실시예들은 소프트웨어 루틴(software routine), 하드웨어 회로(hardware circuit), 펌웨어(firmware), 또는 이들의 조합으로 구현되었는지에 대한 세부 사항들이 제공되지 않았다.
본 발명의 실시예들은 기계 판독 가능 저장 매체(machine readable storage medium)에 저장되는 소프트웨어 제품(software product)으로 구현될 수 있다(컴퓨터 판독가능 매체(computer-readable medium), 프로세서 판독 가능 매체(processor-readable medium), 컴퓨터 판독 가능 프로그램을 가진 컴퓨터 사용가능 매체(computer usable medium)들도 포함된다). 상기 기계 판독 가능 매체(machine-readable medium)는 디스켓, 씨디 롬(compact disk read only memory; CD-ROM), 휘발성(volatile) 또는 비휘발성(non-volatile)의 메모리 장치, 또는 기타 저장 메커니즘을 포함한다. 상기 기계 판독 가능 매체는 자성(magnetic), 광학의(optical), 또는 전자 저장 매체(electrical storage medium)를 포함하는 모든 적합한 유형의 매체일 수 있다. 기계 판독 가능 매체는 다양한 명령들(instructions), 코드 시퀀스(code sequednce), 구성 정보(configuration information) 또는 다른 데이터들을 포함할 수 있고, 기계판독 가능 매체가 실행될 때 프로세서로 하여금 발명의 실시예에 따른 방법의 단계들을 수행하도록 한다. 본 발명의 기술 분야에 통상의 지식을 가진 자들은 본 발명을 실시하는 데 필수적인 명령(instruction)들과 연산(operation)들이 기계 판독 가능 매체(machine-readable medium)에 저장될 수 있다는 것을 이해할 수 있을 것이다. 상기 기계 판독 가능 매체는 상술한 작업들(tasks)을 수행하는 회로와 인터페이스(interface)할 수 있다.
본 발명의 상술한 실시예들은 예시를 목적으로만 기재되었고, 다수의 서로 다른 종류의 소프트웨어 또는 소프트웨어 조각들이 본 발명에 따른 강화된 보안의 혜택을 받을 수 있는 것이 자명하다. 또한, 본 발명의 기술 분야에서 통상의 지식을 가진 자에 의하여 본 발명의 범위를 벗어나지 않는 한 특정한 실시예에 대한 변경, 수정 및 변형이 가능하고, 본 발명의 범위는 여기에 첨부된 특허청구범위에 의해서만 정해진다.

Claims (27)

  1. 빌드시간(build-time) 또는 로드시간(load-time)에 목적 코드(object-code)로의 보안성 변환을 적용하는 방법에 있어서,
    랜덤 시드(seed)를 가상의 무작위 숫자 생성기(pseudo-random number generator)에 입력용으로 특정하는 단계;
    실행 모듈의 개별 인스턴스를 생성하는 단계에 있어서:
    상기 가상의 무작위 숫자 제조기에 입력용으로 상기 랜덤시드를 적용함으로써 복수의 컴파일드 소프트웨어 모듈들의 다변화하여, 상기 복수의 컴파일드 소프트웨어 모듈들(compiled software modules)의 개별 인스턴스들의 집합으로부터 상기 복수의 컴파일드 소프트웨어 모듈들의 인스턴스들을 무작위로 선택하여 상기 컴파일드 소프트웨어 모듈들의 선정된 인스턴스들의 무작위 레이아웃을 결정하는 단계;
    상기 컴파일드 소프트웨어 모듈들의 상기 선택된 인스턴스들을 상기 무작위 레이아웃에 따라서 상기 실행 모듈의 상기 개별 인스턴스를 생성하도록 결합시키는 단계를 포함하여 상기 실행 모듈의 상기 개별 인스턴스를 생성하는 단계; 및
    상기 실행 모듈의 상기 개별 인스턴스 내부의 심볼들을 해결하는 단계를 포함하는 보안성 변환의 적용방법.
  2. 제 1 항에 있어서, 상기 무작위 선정은 복수의 인스텐시에이트 모듈들(instantiated modules)을 포함하는 다양하게 프로비저닝된(provisioned) 라이브러리로부터 무작위 선택하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  3. 제 2 항에 있어서, 상기 다양하게 프로비저닝된(provisioned) 라이브러리 내의 각 인스텐시에이트 모듈은 개별 보안성 특성들(distinct security characteristics)을 예시하고, 상기 무작위 선택하는 단계는,
    복수의 컴파일드 소프트웨어 모듈들의 어셋(asset) 순위 및 복수의 컴파일드 소프트웨어 모듈들 내부의 콜 사이트들(call cites)의 프로파일 가중을 복수의 컴파일드 소프트웨어 모듈 내부로 끼워 넣는 단계;
    상기 어셋(asset) 순위와 상기 프로파일 가중에 기초한 상기 무작위 선정을 제한하는 단계를 더 포함하는 보안성 변환의 적용 방법.
  4. 제 1 항에 있어서, 상기 무작위 레이아웃을 결정하는 단계는 상기 선정된 컴파일드 소프트웨어 모듈들의 인스턴스들을 분리된 코드 부분으로 진입시켜 메모리 영상 내부의 코드 부분의 위치가 무작위로 배정하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  5. 제 4 항에 있어서, 상기 코드 부분들의 상기 위치를 무작위로 배정하는 단계는 상기 컴파일드 소프트웨어 모듈들의 상기 선정된 인스턴스들의 다른 것들로부터 코드 부분들을 혼합하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  6. 제 4 항에 있어서, 상기 부분들의 위치를 무작위로 배정하는 단계는 상기 컴파일드 소프트웨어 모듈들들의 상기 선정된 인스턴스들의 다른 부분들과 데이터부분을 혼합하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  7. 제 1 항에 있어서, 상기 다변화 작업들은 보안성 변환상수들의 후기 바인딩을 더 포함하되,
    상기 랜덤 시드를 상기 허위의 무작위 숫자 생성기의 입력항으로서 상기 컴파일드 소프트웨어 모듈들의 상기 선정된 인스턴스들에 적용되는 보안성 변환들에 대한 메타데이터에 따라서 상기 보안성 병환 상수들을 무작위로 결정하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  8. 제 7 항에 있어서, 상기 보안성 변환들은 프로그램 변환들인 것을 특징으로 하는 보안성 변환의 적용 방법.
  9. 제 8 항에 있어서, 상기 프로그램 변환들은 데이터 흐름 변환들 또는 제어 흐름 변환들인 것을 특징으로 하는 보안성 변환의 적용 방법.
  10. 실행 프로그램 영상의 복수의 다이버스(diverse) 인스턴스들을 생성하는 방법에 있어서,
    원하는 실행 프로그램의 영상의 인스턴스를 얻기 위해서는,
    랜덤시드를 가상의 무작위 숫자 생성기입력용으로 명시하는 단계;
    실행프로그램 영상의 개별 인스턴스를 생성하는 단계;
    상기 가상의 무작위 숫자 제조기에 입력용으로 상기 랜덤시드를 적용함으로써 복수의 컴파일드 소프트웨어 모듈들의 다변화하여, 상기 복수의 컴파일드 소프트웨어 모듈들(compiled software modules)의 개별 인스턴스들의 집합으로부터 상기 복수의 컴파일드 소프트웨어 모듈들의 인스턴스들을 무작위로 선택하여 상기 컴파일드 소프트웨어 모듈들의 선정된 인스턴스들의 무작위 레이아웃을 결정하는 단계;
    상기 컴파일드 소프트웨어 모듈들의 상기 선택된 인스턴스들을 상기 무작위 레이아웃에 따라서 상기 실행 프로그램 영상의 상기 개별 인스턴스를 생성하도록 결합시키는 단계를 포함하여 상기 실행 모듈의 상기 개별 인스턴스를 생성하는 단계; 및
    상기 실행 모듈의 상기 개별 인스턴스 내부의 심볼들을 해결하는 방법을 포함하는 보안성 변환의 적용 방법.
  11. 제 10 항에 있어서, 상기 무작위 선정을 하는 단계는 복수의 인스텐시에이트 모듈들을 포함하는 다양하게 프로비저닝된(provisioned) 라이브러리로부터 무작위 선정을 하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  12. 제 11 항에 있어서, 상기 다양하게 프로비저닝된 라이브러리 내 인스텐시에이트 모듈은 개별 보안 특성들로 인스텐시에이트(instantiate)되고, 상기 무작위 선택을 하는 단계는,
    상기 복수의 컴파일드 소프트웨어 모듈들의 어셋(asset) 순위와 콜 사이트들의 프로파일 가중을 복수의 컴파일드 소프트웨어 모듈들에 끼워넣는 단계;
    상기 어셋(asset) 순위와 상기 프로파일 가중에 기초한 상기 무작위 선택을 포함하는 단계를 더 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  13. 제 10 항에 있어서, 상기 랜덤 레이아웃을 결정하는 단계는 상기 컴파일드 소프트웨어 모듈들의 상기 선정된 인스턴스들을 분리된 코드 부분들로 진입시키는 단계와 상기 메모리 영상 내부의 상기 코드 부분의 위치를 무작위로 배정하도록 하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  14. 제 13 항에 있어서, 상기 코드부분들의 상기 위치를 무작위 배정하는 단계는 상기 컴파일드 소프트웨어 모듈들의 상기 선정된 인스턴스들의 다른 것들로부터 코드 부분을 혼합하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  15. 제 13 항에 있어서, 상기 부분들의 상기 위치를 무작위 배정하는 단계는 상기 컴파일드 소프트웨어 모듈들의 상기 선정된 인스턴스들의 다른 것들의 코드 부분들과 데이터 부분들을 혼합하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  16. 제 10 항에 있어서, 상기 다변화 작업들은 보안성 변환 상수들의 후기 바인딩을 더 포함하되,
    상기 랜덤 시드를 상기 가상의 무작위 숫자 생성기의 입력용으로 상기 컴파일드 소프트웨어 모듈들의 선정된 인스턴스들에 적용되는 보안성 변환들에 대한 메타 데이터에 따라 상기 보안성 변환 상수들을 무작위로 결정하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  17. 제 16 항에 있어서, 상기 보안성 변환들은 프로그램 변환들인 것을 특징으로 하는 보안성 변환의 적용 방법.
  18. 제 17 항에 있어서, 상기 프로그램 변환들은 데이터 흐름 변환들 또는 제어 흐름 변환들인 것을 특징으로 하는 보안성 변환의 적용 방법.
  19. 실행 프로그램 영상의 복수의 다이버스(diverse) 인스턴스들을 생성하는 방법에 있어서,
    원하는 실행 프로그램 영상의 인스턴스 또는 동적 라이브러리는,
    랜덤 시드(seed)를 무작위 선택을 하는 가상의 무작위 숫자 생성기(pseudo-random number generator)에 입력용으로 특정하는 단계;
    다변화 작업들을 적용하여 상기 무작위 선택으로 결정된 복수의 컴파일드 소프트웨어 모듈들을 복수의 컴파일드 소프트웨어 모듈들로 변환하고, 복수의 컴파일드 소프트웨어 모듈들과 관계된 심볼들을 해결하는 단계; 및
    상기 해결된 심볼들에 의해 결정된 개별 환경설정(configuration)을 가지는 상기 실행 프로그램 영상의 인스턴스들을 생성하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  20. 제 19 항에 있어서, 상기 복수의 컴파일드 소프트웨어 모듈들을 변환하는 단계는 상기 복수의 소프트웨어 모듈의 무작위로 된 메모리 영상 레이아웃을 제공하기 위해 심볼들을 해결하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  21. 제 19 항에 있어서, 복수의 컴파일드 소프트웨어 모듈들을 변환하는 단계는 상기 복수의 소프트웨어 모듈들의 개별 인스턴스들의 무작위로 선정하기 위하여 상기 심볼들을 해결하는 단계를 포함하는 것을 특징으로 하는 보안성 변환의 적용 방법.
  22. 빌드 시간(build-time)에 압축된 실행 모듈의 복수의 다이버스(diverse) 개별 인스턴스들을 제공하기 위한 링커는,
    프로세서가 런타임(Run-time)에 실행 모듈의 다이버스(diverse) 개별 인스턴스들을 개별 무작위 선택하도록 환경 설정된 가상의 무작위 숫자 생성기; 및
    상기 프로세서가 복수의 컴파일드 소프트웨어 모듈들을 변환하도록 하는 런타임 모듈을 포함하되,
    다변화 과정을 적용함으로써 상기 무작위 선택에 의하여 결정된 복수의 컴파일드 소프트웨어 모듈들을 변환하는 단계와;
    상기 복수의 컴파일드 소프트웨어 모듈들과 관계되는 심볼들을 해결하는 단계; 및
    상기 프로그램의 각 실시에 따른 상기 해결된 심볼들에 의해 결정된 개별 환경설정을 가지는 실행 프로그램 영상의 인스턴스를 생성하는 단계를 포함하는 것을 특징으로 하는 링커.
  23. 런타임(run-time)에 실행 프로그램 영상의 다이버스(diverse) 개별 인스턴스들을 제공하는 로더에 있어서,
    프로세서가 상기 실행 프로그램 영상의 각 다이버스(diverse) 개별 인스턴스를 위하여 개별 무작위 선택을 생성하도록 환경 설정된 가상의 무작위 숫자 생성기; 및
    상기 무작위 선택에 의해 결정된, 복수의 컴파일드 소프트웨어 모듈들을 다변화 작업들을 적용하여 변환하는 단계와;
    상기 복수의 컴파일드 소프트웨어 모듈들에 관계되는 심볼들을 해결하는 단계;
    상기 해결된 심볼들에 의해 결정되는 개별 환경설정을 가지는 상기 실행 프로그램 영상의 인스턴스를 생성하는 단계를 포함하여 상기 프로세서가 복수의 컴파일드 소프트웨어 모듈들을 변환하도록 하는 연결(linking) 모듈들을 포함하는 보안성 변환의 적용 방법.
  24. 실행 프로그램 영상의 복수의 다이버스(diverse) 인스턴스를 생성하는 로더에 있어서,
    실행 프로그램 영상의 원하는 인스턴스를 위해 프로세서가 개별 무작위 선택을 생성하도록 설정된 가상의 무작위 숫자 생성기; 및
    상기 복수의 컴파일드 소프트웨어 모듈들의 개별 인스턴스들의 집합으로부터 상기 복수의 컴파일드 소프트웨어 모듈들의 인스턴스를 선택하는 상기 무작위 선택을 적용함으로써 복수의 컴파일드 소프트웨어 모듈들에 다변화 작업을 적용하는 단계;
    상기 컴파일드 소프트웨어 모듈들의 상기 선전된 인스턴스들을 상기 무작위 레이아웃에 따라서 상기 실행 프로그램 영상의 개별 인스턴스를 생성하도록 결합시키는 단계; 및
    실행 프로그램 영상의 상기 개별 인스턴스 내부의 심볼들을 해결하는 단계를 포함하여 상기 프로세서가 상기 실행 프로그램 영상의 개별 인스턴스를 생성하도록 하는 런타임(run-time) 모듈을 포함하는 로더.
  25. 제 24 항에 있어서, 상기 무작위 레이아웃은 런타임(run-time) 로딩 중 랜덤 어드레스 업무를 포함하는 것을 특징으로 하는 로더.
  26. 제 24 항에 있어서, 상기 복수의 소프트웨어 모듈들의 인스턴스들의 상기 선정은 런타임 컨디션들을 더 기초로 하는 것을 특징으로 하는 로더.
  27. 제 26 항에 있어서, 상기 런타임(run-time) 컨디션들은 승인되지 않은 브리치(breach)를 검출하는 단계를 포함하는 것을 특징으로 하는 로더.
KR1020127028136A 2010-03-31 2010-03-31 어플리케이션을 보호하기 위한 링크와 로드 방법 KR20140053756A (ko)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/CA2010/000450 WO2011120122A1 (en) 2010-03-31 2010-03-31 Method for linking and loading to protect applications

Publications (1)

Publication Number Publication Date
KR20140053756A true KR20140053756A (ko) 2014-05-08

Family

ID=44711251

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020127028136A KR20140053756A (ko) 2010-03-31 2010-03-31 어플리케이션을 보호하기 위한 링크와 로드 방법

Country Status (7)

Country Link
US (1) US9639377B2 (ko)
EP (1) EP2553570B1 (ko)
JP (1) JP5735629B2 (ko)
KR (1) KR20140053756A (ko)
CN (1) CN102939587B (ko)
CA (1) CA2792304C (ko)
WO (1) WO2011120122A1 (ko)

Families Citing this family (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9645992B2 (en) 2010-08-21 2017-05-09 Oracle International Corporation Methods and apparatuses for interaction with web applications and web application data
US9128732B2 (en) * 2012-02-03 2015-09-08 Apple Inc. Selective randomization for non-deterministically compiled code
US9722972B2 (en) 2012-02-26 2017-08-01 Oracle International Corporation Methods and apparatuses for secure communication
DE102012024250B4 (de) * 2012-08-02 2023-04-13 Masktech International Gmbh Verfahren zur Bereitstellung von Chips mit hoher Kopierschutzfunktion, insbesondere für digitale Authentifizierungssysteme, wie Chipkarten oder dergleichen, sowie danach hergestellte Chips
US9344422B2 (en) 2013-03-15 2016-05-17 Oracle International Corporation Method to modify android application life cycle to control its execution in a containerized workspace environment
WO2014144961A1 (en) * 2013-03-15 2014-09-18 Oracle International Corporation Establishing trust between applications on a computer
US9129112B2 (en) 2013-03-15 2015-09-08 Oracle International Corporation Methods, systems and machine-readable media for providing security services
US9268552B1 (en) * 2013-06-18 2016-02-23 Ayla Networks, Inc. Patching improvement for executables in memory constrained devices
CN103885785A (zh) * 2014-04-09 2014-06-25 南京长观信息科技有限公司 一种描述3d场景中大批量随机同类对象的方法
US10019569B2 (en) * 2014-06-27 2018-07-10 Qualcomm Incorporated Dynamic patching for diversity-based software security
KR101695639B1 (ko) * 2014-08-13 2017-01-16 (주)잉카엔트웍스 클라우드 기반의 애플리케이션 보안 서비스 제공 방법 및 시스템
CN105335286B (zh) * 2014-08-15 2018-02-16 阿里巴巴集团控股有限公司 一种静态库测试方法及装置
CN106663018B (zh) 2014-09-24 2020-09-15 甲骨文国际公司 修改移动设备应用生命周期的系统、方法、介质和设备
US10275154B2 (en) 2014-11-05 2019-04-30 Oracle International Corporation Building memory layouts in software programs
US10353793B2 (en) 2014-11-05 2019-07-16 Oracle International Corporation Identifying improvements to memory usage of software programs
US9552192B2 (en) * 2014-11-05 2017-01-24 Oracle International Corporation Context-based generation of memory layouts in software programs
WO2018097866A2 (en) * 2016-08-18 2018-05-31 Yongxin Zhou Software protection via keyed relational randomization
CN107015491B (zh) * 2017-04-13 2019-05-14 北京机械设备研究所 一种顺序控制方法
US12007908B2 (en) * 2017-12-14 2024-06-11 Arris Enterprises Llc Method and apparatus to dynamically encode data at runtime
CN110134428B (zh) * 2018-02-09 2024-02-06 中兴通讯股份有限公司 一种安全防护方法及装置
US11113392B2 (en) * 2018-08-14 2021-09-07 RunSafe Security, Inc. Executable binary code insertion
TWI768255B (zh) * 2019-10-28 2022-06-21 瑞昱半導體股份有限公司 雲端部署開機映像的電子裝置、開機映像的雲端部署系統及其方法
CN112784275B (zh) * 2019-11-01 2024-09-03 瑞昱半导体股份有限公司 电子装置、开机映像的云端部署系统及其方法
WO2022140347A1 (en) * 2020-12-21 2022-06-30 RunSafe Security, Inc. System and methods for post-mortem debugging of transformed binaries
US12050668B1 (en) * 2021-01-08 2024-07-30 Take-Two Interactive Software, Inc. Method and system for obfuscating and protecting game logic and variables during video game compilation
US11539503B2 (en) * 2021-03-03 2022-12-27 Red Hat, Inc. Container management for cryptanalysis attack protection
US11662987B2 (en) 2021-08-06 2023-05-30 International Business Machines Corporation Logically splitting object code into modules with lazy loading of content
CN113867720B (zh) 2021-09-29 2024-12-24 上海同星智能科技有限公司 软件平台用第三方程序库函数互调方法及互调系统
EP4167111B1 (en) * 2021-10-12 2024-05-01 Planora Oy Method and apparatus for preparing unique software
CN115794260B (zh) * 2023-02-06 2023-05-05 湖南高至科技有限公司 一种简单的dsp软件库动态加载方法

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7565665B2 (en) 1998-09-09 2009-07-21 Microsoft Corporation Efficient linking and loading for late binding and platform retargeting
US6801999B1 (en) * 1999-05-20 2004-10-05 Microsoft Corporation Passive and active software objects containing bore resistant watermarking
US6594761B1 (en) 1999-06-09 2003-07-15 Cloakware Corporation Tamper resistant software encoding
US6779114B1 (en) 1999-08-19 2004-08-17 Cloakware Corporation Tamper resistant software-control flow encoding
US7287166B1 (en) * 1999-09-03 2007-10-23 Purdue Research Foundation Guards for application in software tamperproofing
KR100568228B1 (ko) 2003-05-20 2006-04-07 삼성전자주식회사 고유번호를 이용한 프로그램 탬퍼 방지 방법과 난독처리된 프로그램 업그레이드 방법, 상기 방법을 위한 장치
US7454745B2 (en) * 2003-07-31 2008-11-18 International Business Machines Corporation Automated semantic-based updates to modified code base
US8307354B2 (en) 2004-06-28 2012-11-06 Panasonic Corporation Program creation device, program test device, program execution device, information processing system
US20060179421A1 (en) * 2005-02-09 2006-08-10 International Business Machines Corporation Dynamic interface binding using XML transformations
US7567971B2 (en) * 2005-05-20 2009-07-28 International Business Machines Corporation Generic symbol referencing mechanism
US20070245323A1 (en) * 2006-04-13 2007-10-18 Apple Computer, Inc. Sharing compiled versions of files
US20080016314A1 (en) 2006-07-12 2008-01-17 Lixin Li Diversity-based security system and method
US7724918B2 (en) * 2006-11-22 2010-05-25 International Business Machines Corporation Data obfuscation of text data using entity detection and replacement
US20130124849A1 (en) * 2009-08-26 2013-05-16 Joseph D. Steele System And Method For Individualizing Content For A Consumer

Also Published As

Publication number Publication date
JP2013524321A (ja) 2013-06-17
CA2792304C (en) 2018-07-31
US20130014275A1 (en) 2013-01-10
CN102939587A (zh) 2013-02-20
EP2553570A4 (en) 2014-04-09
US9639377B2 (en) 2017-05-02
EP2553570B1 (en) 2018-08-15
WO2011120122A1 (en) 2011-10-06
EP2553570A1 (en) 2013-02-06
CA2792304A1 (en) 2011-10-06
CN102939587B (zh) 2016-08-03
JP5735629B2 (ja) 2015-06-17

Similar Documents

Publication Publication Date Title
KR20140053756A (ko) 어플리케이션을 보호하기 위한 링크와 로드 방법
Gal et al. Trace-based just-in-time type specialization for dynamic languages
KR101440646B1 (ko) 컴퓨터 구현가능 방법, 및 소프트웨어 보안 향상 방법
Rose Bytecodes meet combinators: invokedynamic on the JVM
US10216497B2 (en) Selective compiling method, device, and corresponding computer program product
CN103460217A (zh) 用于保护应用程序和相关计算机程序产品的方法
US7418699B2 (en) Method and system for performing link-time code optimization without additional code analysis
CN113342323B (zh) 软件在线开发的方法及装置
Grimmer et al. An efficient native function interface for java
Murphy et al. Software profiling options and their effects on security based diversification
US20080250399A1 (en) Evaluation and Selection of Programming Code
Liem et al. A compiler-based infrastructure for software-protection
Li et al. Towards a generic framework for automating extensive analysis of android applications
Reif et al. TACAI: an intermediate representation based on abstract interpretation
Daynes et al. Sharing the runtime representation of classes across class loaders
Yusuf et al. On-stack replacement to improve JIT-based obfuscation a preliminary study
Kang et al. Modular implementation of adaptive decisions in stochastic simulations
Abrath Practical protections for native programs
McGachey et al. Classifying Java class transformations for pervasive virtualized access
Robatmili et al. Muscalietjs: Rethinking layered dynamic web runtimes
Petráček LLVM obfuskátor
Vernemmen Semantic software renewability
Ghosh et al. What's the PointiSA?
Solutions DashO User's Guide
De Bus et al. Diabatik: Diablo’s instrumentation toolkit

Legal Events

Date Code Title Description
PA0105 International application

Patent event date: 20121026

Patent event code: PA01051R01D

Comment text: International Patent Application

PG1501 Laying open of application
A201 Request for examination
PA0201 Request for examination

Patent event code: PA02012R01D

Patent event date: 20150323

Comment text: Request for Examination of Application

N231 Notification of change of applicant
PN2301 Change of applicant

Patent event date: 20150415

Comment text: Notification of Change of Applicant

Patent event code: PN23011R01D

E902 Notification of reason for refusal
PE0902 Notice of grounds for rejection

Comment text: Notification of reason for refusal

Patent event date: 20160830

Patent event code: PE09021S01D

E902 Notification of reason for refusal
PE0902 Notice of grounds for rejection

Comment text: Notification of reason for refusal

Patent event date: 20170428

Patent event code: PE09021S01D

E90F Notification of reason for final refusal
PE0902 Notice of grounds for rejection

Comment text: Final Notice of Reason for Refusal

Patent event date: 20171027

Patent event code: PE09021S02D

E601 Decision to refuse application
PE0601 Decision on rejection of patent

Patent event date: 20180227

Comment text: Decision to Refuse Application

Patent event code: PE06012S01D

Patent event date: 20171027

Comment text: Final Notice of Reason for Refusal

Patent event code: PE06011S02I

Patent event date: 20170428

Comment text: Notification of reason for refusal

Patent event code: PE06011S01I

Patent event date: 20160830

Comment text: Notification of reason for refusal

Patent event code: PE06011S01I