KR20220047928A - 소스 수정 엔진 - Google Patents

소스 수정 엔진 Download PDF

Info

Publication number
KR20220047928A
KR20220047928A KR1020217037438A KR20217037438A KR20220047928A KR 20220047928 A KR20220047928 A KR 20220047928A KR 1020217037438 A KR1020217037438 A KR 1020217037438A KR 20217037438 A KR20217037438 A KR 20217037438A KR 20220047928 A KR20220047928 A KR 20220047928A
Authority
KR
South Korea
Prior art keywords
file
assembly
assembly source
source file
sme
Prior art date
Application number
KR1020217037438A
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 KR20220047928A publication Critical patent/KR20220047928A/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
    • G06F21/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
    • 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/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis
    • 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/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management

Abstract

하나 이상의 어셈블리 소스 파일들을 수정함으로써 소프트웨어를 사이버 하드닝하는 시스템들 및 방법들. 일부 실시예들에서, 개시된 SME 도구는 수정되는 어셈블리 소스 파일들의 빌드 프로세스로 투명하게 그리고 끊김 없이 통합한다. 예컨대, 애플리케이션의 개발 환경으로의 개시된 SME 도구의 통합 시에, 최종 실행 파일의 수정들은 개발자에게 투명하며, 다른 사이버 하드닝 기법들을 지원할 수 있다. SME 도구는 어셈블리 소스 파일과 연관된 속성들(예컨대, 함수들)을 식별하기 위한 사전 프로세싱 도구를 포함한다. SME 도구는 또한 어셈블리 소스 파일을 수정하기 위한 변환 도구를 포함한다. 일부 실시예들에서, 변환들은 어셈블리 소스 파일과 연관된 속성들에 하나 이상의 변환들을 적용하는 것에 대응한다.

Description

소스 수정 엔진
[0001] 본 출원은 2019년 4월 18일자로 출원된 미국 가특허 출원 번호 제 62/835,625호에 대한 우선권을 주장하는 국제 출원이고, 상기 출원은 그 전체가 인용에 의해 본원에 포함된다.
[0002] 본 개시내용은 코드 변환(code transformation)들에 관한 것이다. 더 상세하게, 본원에서 개시된 실시예들은 사이버 하드닝(cyber hardening)을 가능하게 하기 위해 소스 코드(source code)(예컨대, 어셈블리 코드(assembly code))의 변환을 수행하는 시스템들, 장치들, 및 방법들에 관한 것이다.
[0003] 소스 코드에 대한 변환들은 상이한 중간 표현들에 대해 수행될 수 있다. 프로그램 실행 동안 최적화들을 지원하기 위해 소스 코드를 바이너리 코드(binary code)로 변환하는 데 상이한 중간 표현들이 컴파일러(compiler)들에 의해 사용될 수 있다. 그러나, 소스 코드를 수정하는 것에 대한 컴파일러-기반 접근법들에는 난제들이 있을 수 있다. 예컨대, 이러한 난제들은 변환들을 기록하기 위한 개발 시간 및 시간이 지남에 따라 변환들을 유지하려는 노력들에 관한 것일 수 있다. 추가로, 사용을 위해 이용가능한 많은 수의 컴파일러들, 아키텍처(architecture)들, 및 운영 시스템들로 인해, 광범위한 조합들에 대한 컴파일러-기반 변환들의 적용은 엄청난 개발 노력을 요구할 것이다. 더 추가로, 컴파일러들은 단일 파일들에 대해 동작하는 반면, 일부 사이버 하드닝 방법들은 시스템 레벨 접근법에 기초한다. 따라서, 소스 코드를 수정하기 위한 개선된 시스템들 및 방법들이 필요하다.
[0004] 도 1은 사이버 하드닝과 관련하여 취해진 동작(action)들 또는 단계들을 도시하는 예시적 타임라인(timeline)을 예시한다.
[0005] 도 2는 일반적 빌드 프로세스(build process)로의 SME(source modification engine) 도구의 실시예의 통합을 도시하는 블록 (활동) 다이어그램이다.
[0006] 도 3은 개시된 SME 도구의 실시예에 포함된 컴포넌트(component)들을 도시하는 블록 (컴포넌트) 다이어그램이다.
[0007] 도 4는 개시된 SME 도구의 실시예에 포함된 컴포넌트들을 도시하는 블록 (클래스) 다이어그램이다.
[0008] 도 5a는 SME 도구를 사용하지 않는 빌드의 예이다.
[0009] 도 5b는 개시된 SME 도구의 실시예에 포함된 파일들/디렉토리들의 리스트의 예이다.
[0010] 도 5c는 개시된 SME 사전 프로세싱 도구의 실시예의 예시적 사용들과 연관된 도움 텍스트(help text)의 예이다.
[0011] 도 5d는 개시된 SME 변환 도구의 실시예의 예시적 사용들과 연관된 도움 텍스트의 예이다.
[0012] 도 5e는 개시된 SME 도구의 실시예를 사용하는 빌드의 예이다.
[0013] 도 6은 SME 도구의 동작 단계들을 도시하는 프로세스의 흐름도이다.
[0014] 본 개시내용은 하나 이상의 어셈블리 소스 파일들을 수정함으로써 소프트웨어를 사이버 하드닝하는 시스템들 및 방법들에 관한 것이다. 사이버 하드닝은 미래의 사이버 공격들로부터 소프트웨어를 보호하기 위한 일련의 동작들 또는 단계들로서 설명될 수 있다. 어셈블리 소스 파일들을 수정하는 하나의 특허가능한 이점은 수정들 또는 변경들이 소스 코드가 기록되는 고레벨 소스 언어(예컨대, C, C++, Pascal, Fortran, Objective C 등)에 대해 불가지론적(agnostic)이라는 것이다. 어셈블리 소스 파일들을 수정하는 다른 이점은, 수정들이 소프트웨어가 실행되거나 또는 실행될 운영 체제 또는 플랫폼에 대해 불가지론적이라는 것이다. 일부 실시예들에서, 어셈블리 소스 파일들의 수정들은 소프트웨어가 실행되거나 또는 실행될 컴파일러들에 대해 불가지론적(예컨대, PowerPC)이거나 또는 거의 불가지론적이다.
[0015] 본 개시내용은 SME(source modification engine) 도구를 사용하여 하나 이상의 어셈블리 소스 파일들이 수정되는 실시예들에 관한 것이다. 일부 실시예들에서, SME 도구(예컨대, 주로 소프트웨어 도구)는 수정되는 어셈블리 소스 파일들의 빌드 프로세스로 투명하게 그리고 끊김 없이 통합한다. 예컨대, 애플리케이션의 개발 환경으로의 개시된 SME 도구의 통합 시에, 최종 실행 파일의 수정들은 개발자에게 투명하며, 다른 사이버 하드닝 기법들을 지원할 수 있다. 결과적으로, SME 도구는 다른 기법들로는 실제적이지 않은 애플리케이션들의 하드닝을 가능하게 하기 위한 플랫폼을 제공한다. 본원에서의 논의들을 위해, "빌드 시스템", "빌드", "빌딩", "빌드 프로세스"라는 용어들은 일반적으로 동의어이고, 소프트웨어 애플리케이션들을 컴파일하는 것과 연관된 도구들, 스크립트들, 및 소프트웨어의 프레임워크를 지칭한다.
[0016] 이제 본 발명을 더 상세하게 참조하면, 도 1은 사이버 하드닝과 관련하여 취해진 동작들 또는 단계들의 예시적 타임라인을 예시한다. 소스 코드의 개발(좌측 끝) 이후에, 이 동작들 또는 단계들(사이버 하드닝 단계들로 또한 알려짐)은 미래의 사이버 공격들로부터 소프트웨어를 보호하는 것을 돕기 위해 연속체의 특정 스테이지에서의 파일의 수정 또는 변환을 포함한다. 도 1의 예시적 타임라인은 소스 코드로부터 최종 바이너리까지의 연속체를 도시하고, 사이버 하드닝이 발생할 수 있는 가능한 위치들을 포함한다. 사이버 하드닝 위치들의 예들은 소스 파일(고레벨 언어로 기록됨), 어셈블리 소스 파일, 및/또는 프로그램 바이너리에 있을 수 있다.
[0017] 컴파일된 프로그램 바이너리들의 전체적 그리고 완전한 분석은 어렵다. 바이너리 분석이 불완전하거나 또는 부정확하면, 바이너리의 변환은, 변환이 성장하거나, 리로케이팅(relocate)되거나, 또는 함수들을 이동시키는 경우 부정확성들을 초래할 수 있다.
[0018] 반대로, 어셈블리 소스 파일들은 CFI 검사들의 삽입과 같은 수정들을 위한 더 양호한 로케이션을 제공하며, 이들 둘 모두는 본원에 인용에 의해 포함된다. CFI 검사들과 관련된 구현의 세부사항들은 2018년 8월 15일자로 출원된 출원 번호 제 62/764,705호, 및 2018년 8월 15일자로 출원된 제 62/764,751호에서 논의되었다. CFI 검사들은, 컴파일 프로세스를 구성들을 컴파일 및 어셈블링 구성들로 분리함으로써 어셈블리 레벨에서 삽입될 수 있다. 컴파일 이후에, 도구는 CFI 구현에 의해 필요한 지원 코드 및 CFI 검사들을 추가하는 어셈블리를 수정할 수 있다. 그런 다음, 수정된 어셈블리가 어셈블링되고 링크된다. 개시된 SME 도구에 의한 어셈블리 소스 파일들에 대한 사이버 하드닝 수정들(이를테면, CFI)은, 소프트웨어 애플리케이션이 손상되지 않는 한, 소프트웨어 애플리케이션의 거동이 변경되지 않도록 설계된다. 변경된 거동의 구현은 변환에 의해 핸들링(handle)된다. 사이버 하드닝 동작들은 미래의 사이버 공격들로부터 컴퓨터 코드를 선제적으로 보호하는 데 있어서 특허가능한 이익을 제공한다.
[0019] 도 2는 일반적 빌드 프로세스(build process)로의 SME(source modification engine) 도구의 실시예의 통합을 도시하는 블록 (활동) 다이어그램이다. 다시 말해서, 도 2는 개시된 SME 도구가 빌드 프로세스로 통합될 수 있는 방법을 설명한다. 도 2에서, 직사각형 박스들은 파일들 및 데이터베이스들과 같은 물리적 속성들을 표현한다. 둥근 박스들은 활동들 또는 단계들을 표현한다. 도 2에서, 영역(250)은 개시된 SME 도구를 사용하여 빌드 프로세스의 활동들의 시퀀스를 예시한다. 영역(252)은 개시된 SME 도구를 사용하여 어셈블리 소스 파일 수정과 연관된 속성들 및 활동들을 예시한다. 일부 실시예들에서, 개시된 SME 도구는 SME 사전 프로세싱 도구(206), SME 데이터베이스(210), 및 SME 변환 도구(214)를 포함한다. 도 2에 도시된 바와 같이, 빌드 프로세스는 SME 사전 프로세싱 도구(206)가 (예컨대, 데이터스토어(datastore)에 저장된) 소스 코드(208)로부터의 정보를 프로세싱할 때 시작 단계(202)에서 시작된다. 정보의 예들은 함수 이름들, (예컨대, 커널 코드에서 나타나는 바와 같이) 상이한 파일들에서의 함수들 사이의 비표준 호출 컨벤션(non-standard calling convention)들에 대한 정보, 디버그 어셈블리 소스 지시어들, 및 다수의 어셈블리 소스 파일들에 걸쳐 공유되는 데이터에 대한 레퍼런스(reference)들(예컨대, 데이터가 함수에 의해 사용될 수 있음)일 수 있다. SME 데이터베이스(210)는 SME 사전 프로세싱 도구(206)에 의해 수집된 데이터를 저장한다. SME 데이터베이스(210)의 출력은 SME 변환 도구(214)에 공급된다. SME 변환 도구(214)는 수정된 디스어셈블링된 파일(216)인 SME 데이터베이스(210)의 출력에 대해 요청된 변환(transform)(변환(transformation)으로 또한 알려짐)을 수행한다. 수정된 디스어셈블링된 파일(216)은 데이터스토어에 저장될 수 있다. 수정된, 디스어셈블링된 파일(216)은 어셈블러 프로그램(222)에 공급되며, 이 어셈블러 프로그램(222)은 컴파일된 바이너리들(226)을 생성하도록 링커(224)에 공급되며, 이는 스트립(strip)된 바이너리들(228)을 형성하도록 편집되어 데이터스토어에 저장될 수 있다(230). 바이너리들이 스트립될 수 있는 정보의 예들은 함수들의 이름들, 디버깅 데이터, 개발자가 제공한 데이터 등을 포함한다. 바이너리들(228)을 스트립하는 것은 프로그램이 해커들에 의해 해킹될 가능성을 감소시키는 것으로 의미된다. 바이너리를 스트립하는 다른 이유는 바이너리가 더 적은 저장 공간을 차지하도록 바이너리의 사이즈를 감소시키는 것이다. 프로세스로부터의 최종 실행 파일(232)은 스트립된 바이너리들(228)에 대응하거나 또는 이들과 동등하다.
[0020] 출력을 SME 데이터베이스(210)에 전송하는 것과 동시에, SME 사전 프로세싱 도구는 그것의 출력을 사전 프로세싱 단계(218)에 전송할 수 있다. 사전 프로세싱 단계(218)는 예컨대, (존재한다면) 매크로들을 확장 또는 대체하기 위해 또는 다른 컴파일러 사전 프로세싱 단계들을 수행하기 위해 컴파일러에 의해 수행된다. 사전 프로세싱 단계(218)의 출력은 컴파일러에 의해 수행되는 컴파일 단계(220)이다. 전통적 빌드들에서, 컴파일 단계(220)의 출력은 어떠한 SME 기능성도 없이 어셈블러(222)로 직접적으로 이어진다. 그러나, SME 도구를 활용하는 빌드 프로세스들에서, 컴파일 단계(220)의 출력은 SME 변환 도구(214)에 공급되는 디스어셈블리 단계(212)에 공급된다.
[0021] 개시된 SME 도구를 사용하여 어셈블리 소스 파일들을 수정하기 위한 소스-기반 접근법은 몇몇 이점들을 갖는다. 어셈블리 소스 파일을 수정하는 것은 수정되고 있는 어셈블리 소스 파일의 어셈블리-소스 컨텍스트를 변환(예컨대, CFI 변환)의 작성자에게 제공할 수 있다. 이것은 심지어 디버그 심볼들 및 다른 정보에 대한 액세스가 있더라도 바이너리 분석이 흔히 제공할 수 없는 컨텍스트이다. 요구되는 컨텍스트 없이, 사이버 하드닝 변환들은 다음의 방식들에 따라 제한될 수 있다: 실패하기 쉬운 복잡한 휴리스틱(heuristic)들의 사용, 문제가 되는 함수들 또는 코드 영역들을 회피하기 위한 능력, 바이너리에서 검출하기 어려운 실패들을 스포팅(spot)하기 위한 능력, 및 변환을 구현하는 데 있어서의 실수들로 인해 컴파일러에 버그들 또는 에러들을 도입할 증가된 위험.
[0022] 개시된 SME 도구를 사용하는 소스-기반 수정은 컨텍스트의 결여와 연관된 함정들을 감소시키는 것을 추구한다. SME는 컴파일러-기반 접근법을 사용하지 않으면서 이러한 누락된 컨텍스트의 일부를 제공하는 사전 프로세싱 기법을 구현한다.
[0023] 도 3은 SME 도구의 실시예에 포함된 컴포넌트들을 도시하는 블록 (컴포넌트) 다이어그램이다. SME 도구(300)는 SME 사전 프로세싱 도구(302), SME 데이터베이스(304), 및 SME 변환 도구(308)를 포함한다. SME 사전 프로세싱 도구(302)는, 예컨대, 커맨드 라인 인터페이스를 통해, 데이터베이스의 이름(이를테면, SME 데이터베이스(304)) 및 어셈블리 소스 파일(함수 이름들일 수 있는 하나 이상의 파일들의 리스트를 포함함)을 수신한다. 따라서, SME 사전 프로세싱 도구(302)는 빌드 타겟에 대한 파일 리스트에 포함된 하나 이상의 파일들을 조사 및/또는 프로세싱한다. 그런 다음, 데이터베이스는 분석으로부터 캡처된 정보로 증강된다. SME 사전 프로세싱 도구(302)는 SPI(source programming interface) 인터페이스를 사용하여 어셈블리 소스 파일 및 어셈블리 소스 파일에 포함된 정보(예컨대, 함수 이름들)를 판독한다. 일부 실시예들에서, SME 사전 프로세싱 도구(302)는 빌드 타겟(예컨대, 실행 파일) 내에서 어셈블리 소스 파일당 한 번 호출되며, 이는 빌드 타겟과 관련된 어셈블리 소스 파일에 대한 정보로 데이터베이스를 파퓰레이팅(populate)한다. SME 데이터베이스(304)는 Python의 ZODB를 사용하여 구현될 수 있다. 일부 실시예들에서, 빌드 타겟당 하나의 SME 데이터베이스(304)가 연관된다. SME 변환 도구(308)는 SME 데이터베이스(304)와 함께 각각의 어셈블리 소스 파일에 대해 호출된다. (필요하다면) 데이터베이스 내의 정보를 사용하면, SME 변환 도구(308)는 변환을 수행하고, 어셈블링 및 링크될 수 있는 수정된 어셈블리 소스 파일을 출력한다. 일부 실시예들에서, SME 변환 도구(308)는 어셈블리 소스 파일에 삽입될 수 있는 하나 이상의 변환들을 포함할 수 있다. 어셈블리 소스 파일에 삽입될 수 있는 변환의 일 예는 실행 시에 바이너리가 동작하는 방법에 대한 분석을 가능하게 하는 CFI 삽입 모듈이다. 본 기술의 하나의 이점은, 개시된 SME 도구가, 어셈블리 소스 파일로의 통합 이후에, 임의의 종류의 바이너리들 예컨대, 복잡하고 단순한 둘 모두를 분석하는 데 사용될 수 있다는 것이다. 일부 선택적 실시예들에서, SME 사전 프로세싱 도구(302) 및 SME 변환 도구(308)에 의해 공유되는 코드는 다른 모듈 또는 레포지토리, 예컨대, 공통 코드를 저장하기 위한 어셈블리 소스 프로세싱 모듈에 저장될 수 있고, SME 사전 프로세싱 도구(302) 및 SME 변환 도구(308)에 연결될 수 있다.
[0024] 도 4는 SME 도구의 실시예에 포함된 컴포넌트들을 도시하는 블록 (클래스) 다이어그램이다. 도 4의 클래스들과 블록들 사이의 커넥터들은 적절하게 의존성, 계승(inheritance), 및/또는 연관성을 표현한다. 개시된 SME 도구는 베이스 "공통" 클래스(402)로 패키징될 수 있다. common 클래스(402)는 function 클래스(406), instruction 클래스(408), platform 클래스(404), SPI(source processing interface) 클래스(410), source line container 클래스(412), platformimpl 클래스(416), mnemonic helper 클래스(418), filenamelistparser 클래스(420), TII(transform insertion interface) 클래스(414), asmhelper 클래스(428), asminstructionparser 클래스(430), config 테이블(422), parameter(424), 및 value(426)을 포함한다. datastore 클래스(432), transform 클래스(434), plat 클래스(444), arch 클래스(452), 및 asm 클래스(460)는 common 클래스(402)와 연관된다.
[0025] datastore 클래스(432), transform 클래스(434), plat 클래스(444), arch 클래스(452), 및 asm 클래스(460)와 관련하여 도 4에 도시된 클래스들, 함수들, 변수들, 또는 모듈은 x86 64비트 마이크로프로세서/마이크로제어기 아키텍처에서 예시적 구현을 예시한다. SME 도구의 일부 구현들에서, 예컨대, x86 64비트 마이크로프로세서/마이크로제어기 플랫폼을 위해 설계될 때, 플랫폼-특정 속성들이 사용된다. 플랫폼 특정 속성들의 예들은 ISA(instruction Set Architecture)(이를테면, 신택스(syntax), 워드 사이즈, 및 엔디안니스(endianness)), 호출 컨벤션들, 및 컴파일러 특정 라벨들 및 지시어들을 포함한다.
[0026] function 클래스(406)는 어셈블리 소스 파일과 연관된 함수를 표현한다. 그것은 "이것이 글로벌 함수(global function)인가?" 및 "이것이 리프 함수(leaf function)인가?"와 같은 질의들에 응답하기 위해 플랫폼-독립적 추상화들을 제공한다. 그것은 또한 아키텍처-특정 구현들에 대한 액세서(accessor)들을 제공한다. instruction 클래스(408)는 어셈블리 소스 파일 내의 하나 이상의 코드 라인들을 표현한다. 이/이들 코드 라인(들)은 주석, 라벨, 또는 실제 어셈블리 명령일 수 있다. platform 클래스(404)는 transform 클래스(434)에 기능성을 제공하는 메인 클래스이다. platform 클래스(404)는 transform 클래스(434)에 고레벨 추상화들을 제공하고, 아키텍처 및 소스-특정 구현들에 대한 액세서들을 제공한다. SPI(source processing interface) 클래스(410)는 어떤 tii 클래스(414)가, 어셈블리 소스 파일들을 열고, 어셈블리 소스 파일들과 상호 작용하고, 그리고 수정된 어셈블리 소스 파일들을 디스크에 기록/저장하는 것과 같은 동작들을 수행할 수 있는지를 사용하는 인터페이스를 제공한다. source line container 클래스(412)는 소스 코드의 라인 또는 라인들에 대응하는 데이터 클래스이다. source line container 클래스(412)는 transform 클래스(434)에 의한 어셈블리 소스 파일들의 용이한 수정을 위해 function 클래스(406)의 데이터를 저장할 수 있다. 수정되는 것으로 식별되지 않는 어셈블리 소스 파일들의 부분들의 경우, source line container 클래스(412)는 어셈블리 소스 파일의 오리지널 코드를 포함한다. platformimpl 클래스(416)는 platform 클래스(404)에 플랫폼-특정 구현들을 제공한다. 본질적으로, platformimpl 클래스(416)는 적절한 구현 클래스들을 가리킨다.
[0027] 어셈블리 소스 파일들의 명령들 또는 코드는 니모닉(mnemonic) 및 0개 이상의 피연산자들을 포함한다. 니모닉은 'call', 'mov', 'ret' 등과 같은 명령의 인간 판독가능한 표현이다. 니모닉들은 통상적으로 아키텍처 및/또는 어셈블러 특정적이다. mnemonic helper 클래스(418)는 용이한 참조를 위해 니모닉들에 시맨틱 라벨을 제공한다. 예컨대, 인텔 상의 리턴 명령은 'ret'이고, PowerPC 상의 리턴 명령은 'blr'이다. 적절한 아키텍처 상의 적절한 값으로 세팅된 변수 RETURN_MNEMONIC를 정의함으로써, 변환들은 RETURN_MNEMONIC를 참조할 수 있고, 각각의 아키텍처에 대한 하드코딩된 값들을 요구하지 않는다. 따라서, 특허가능한 이익이 획득된다.
[0028] filenamelistparser 클래스(420)는 SME 사전 프로세싱 도구에 의해 조사되는 어셈블리 소스 파일들의 리스트를 포함하는 파일(예컨대, 빌드 시스템에 의해 생성됨)을 파싱하는 것을 핸들링한다. TII(transform insertion interface) 클래스(414)는 transform 클래스(434)와 연관된다. TII 클래스(414)는 사이버 하드닝 보호들을 추가함으로써 어셈블리 소스 파일의 코드를 변경/수정한다. asmhelper 클래스(428)는 어셈블리 소스 파일들을 파싱하기 위한 인터페이스를 제공한다. asmInstructionparser 클래스(430)는 어셈블리 명령들을 파싱하기 위한 인터페이스를 제공한다. asmInstructionparser 클래스(430)(asm 클래스(460)에서 코드에 의해 구현됨)는 주어진 어셈블러의 신택스에 기초하여 어셈블리 명령들을 파싱하기 위한 것이다. config 테이블(422)은 구성 값들을 저장하는 룩업 테이블이다. 이 테이블에서, 'parameter'(예컨대, parameter(424))는 'configuration value'(예컨대, value(426))를 룩업하는 데 사용될 수 있는 키이다. 개시된 SME 도구의 클래스 다이어그램은 단지 예시적 목적들을 위한 것이다. 대안적 구현들에서, SME 도구는 유사한 또는 상이한 클래스들로 상이하게 구현될 수 있다.
[0029] 도 5a-도 5e는 모니터의 커맨드 라인 인터페이스 상에 디스플레이되는 출력들을 도시한다. 도 5a는 SME 도구를 사용하지 않는 빌드의 예이다. 소스 코드 파일들을 컴파일하는 것은 특히, 몇몇 소스 파일들이 빌드에 수반되고 개발자가 실행 파일을 생성하기를 원할 때마다 컴파일링 커맨드들을 타이핑해야 할 때 지루할 수 있다. 따라서, 일부 구현들에서, 실행 파일을 생성하는 태스크를 단순화하는 데 makefile이 사용될 수 있다. makefile들은 make utility와 함께 프로젝트들을 자동으로 빌드 및 관리하는 것을 돕는 특수한 포맷 파일들이다. 도 5a 및 도 5e에서 논의된 예들은 makefile들을 활용한다.
[0030] SME 도구가 없으면, 빌드 프로세스는 소스 파일들을 오브젝트 파일들로 컴파일하는 것을 초래한다. 예컨대, 도 5a에서, 라인(502A)은 helloworld로 명명된 makefile에 대한 make utility를 사용하는 것을 도시한다. 라인들(504A 및 506A)은 오브젝트 파일들 helloworld.o, examplelib.o로 컴파일된 소스 파일들 helloworld.c, examplelib.c(helloworld로 명명된 makefile에 리스팅됨)를 도시한다. 라인(508A)은 오브젝트 파일들이 (커맨드 cc helloworld.o examplelib.o -0 helloworld를 사용하여) 함께 링크되어 실행가능한 바이너리 helloworld를 형성할 수 있다는 것을 도시한다.
[0031] SME 도구를 사용하여 실행 파일을 빌드하는 것은 추가 단계들 및 프로그램들을 수반한다. 빌드로의 통합 시에, SME 도구는 적합한 변환(예컨대, CFI)을 이용하여 빌드의 하나 이상의 어셈블리 소스 파일들의 수정을 가능하게 한다. 개시된 SME 도구의 하나의 특허가능한 이점은, 빌드로의 통합 시에, SME 도구가 빌드와 끊김 없이 동작하고, 의존성 추적 또는 병렬(parallel) 빌드들을 방해하지 않는다는 것이다. 개시된 SME 도구는 빌드를 변경 또는 수정함으로써 빌드로 통합될 수 있다. 변경들은 다음을 포함한다:
● 컴파일 단계의 수정:
- "gcc -c"(소스 코드를 오브젝트 파일로 사전 프로세싱, 컴파일, 및 어셈블링함)와 같은 커맨드들이 "gcc -ggdb -S"로 변경되어, 어셈블리 소스가 오브젝트 파일 대신, 컴파일된 이후에 출력으로 방출된다.
- 빌드 프로세스는 빌드에 수반되는 소스 파일들의 리스트를 포함하는 파일을 생성된다. 이것은 커스텀 메이크 규칙(custom make rule)을 사용함으로써 수동으로 이루어지거나 또는 자동화될 수 있다.
- 컴파일 단계 동안 디버깅이 가능해짐
* SME 변환 도구는, 디버그 심볼들이 인에이블될 때 어셈블리 소스에 배치된 라벨들 및 어셈블러 지시어들을 이용하며, 이러한 추가들은 어셈블리 소스 내의 함수들 및 심볼들을 정확하게 식별하는 것을 돕는다.
* 디버그 심볼들은 그들이 최종 바이너리에서 원하지 않을 경우, 변환 이후에 (선택적으로) 스트립될 수 있다.
● 어셈블리 소스 파일들의 사전 프로세싱:
- SME 사전 프로세싱 도구는 어셈블리 소스 파일들을 조사하고, 어셈블리 소스 파일들로부터 수집된 데이터를 출력한다. 수집된 데이터의 예들은 함수 이름들 (예컨대, 커널 코드에서 나타나는 바와 같이) 상이한 파일들에서의 함수들 사이의 비표준 호출 컨벤션들에 대한 정보, 디버그 어셈블리 소스 지시어들, 및 다수의 어셈블리 소스 파일들에 걸쳐 공유되는 데이터에 대한 레퍼런스들일 수 있다. 수집된 데이터는 SME 데이터베이스(또는 동등하게 확장자 ".S"를 갖는 SME 데이터베이스 파일)에 저장될 수 있다.
● 어셈블리 소스 파일들의 변환:
- SME 변환 도구는 (예컨대, 확장자 ".S"로) 각각의 어셈블리 소스 파일에 대해 동작(예컨대, 하나 이상의 변환들을 적용)하고, 수정된 어셈블리 파일들을 출력한다.
- SME 변환 도구는 변환을 수행할 때 (예컨대, 확장자 ".db"로) SME 데이터베이스 내의 정보를 활용한다.
● 수정된 어셈블리 소스 파일:
- 빌드 시스템은 어셈블리 소스 파일들로부터 오브젝트 파일들을 생성하기 위해 어셈블러(예컨대, as)를 실행한다.
[0032] 도 5b는 개시된 SME 도구의 실시예에 포함된 파일들/디렉토리들의 리스트의 예이다. 도 5b의 라인(502B)은 "arch", "asm", "common", "db", "plat" 및 "transform"으로 명명된 디렉토리들을 도시한다. 도 5b의 라인(502B)은 "preprocess.py" 및 "transform.py"로 명명된 예시적 Python 파일들을 도시한다.
[0033] 도 5c는 개시된 SME 사전 프로세싱 도구의 실시예의 예시적 사용들과 연관된 도움 텍스트의 예이다. 예컨대, 도 5c는 예컨대, 다양한 플래그들 및 인수들과 함께 SME 변환 도구의 다양한 사용들을 도시한다.
[0034] 도 5d는 개시된 SME 변환 도구의 실시예의 예시적 사용들과 연관된 도움 텍스트의 예이다. 예컨대, 도 5d는 예컨대, 다양한 플래그들 및 인수들과 함께 SME 변환 도구의 다양한 사용들을 도시한다.
[0035] 도 5e는 개시된 SME 도구의 실시예를 사용하는 빌드의 예이다. 여기서 '-helloworld' 서픽스는 소스 파일들이 연관되는 빌드 타겟을 표시한다. 도 5e의 영역(502E)은 파일들의 리스트(예컨대, 어셈블리 소스 파일들 "helloworld-sme.s" 및 "examplelib-sme.s"에 대한 이름들 및 filepath들)를 포함하는 "helloworld.files"로 명명된 파일을 생성한 빌드 시스템을 도시한다. 파일들의 리스트를 생성하기 위한 커맨드는 영역(502E)에서의 마지막 명령문, 예컨대,
Figure pct00001
이다.
[0036] 영역(550E)은 SME 사전 프로세싱 도구 및 SME 변환 도구의 중간 결과들을 포함하는, 개시된 SME 도구를 사용하는 결과로서의 빌드의 출력을 도시한다. 영역(504E)은 SME 사전 프로세싱 도구의 결과를 도시한다. 구체적으로, 영역(504E)은 어셈블리 소스 파일들 "helloworld-sme.s" 및 "examplelib-sme.s"를 조사하는 출력이 SME 사전 프로세싱 도구에 의해 "helloworld.db"로 명명된 데이터베이스 파일에 기록되는 것을 도시한다. 영역들(506E 및 508E)은 어셈블리 소스 파일들 "helloworld-sme.s" 및 "examplelib-sme.s"에 대한 SME 변환 도구의 결과들을 도시한다. 예컨대, 이 어셈블리 소스 파일들은 토큰 "f4f4f4f4" 및 "transform.py"로 명명된 변환 파일의 도움으로 (수정된 어셈블리 소스 파일들로) 변환된다. 일부 예들에서, 토큰은 함수 엔트리 포인트들 및 함수 호출 리턴 사이트들에 배치된 4 바이트 값(또는 다른 적합한 사전 결정된 길이)일 수 있다. transform.py는 토큰의 존재를 확인하기 위해 어셈블리 소스 파일을 수정한다. 실패한 검사는 코드가 손상되었다는 것을 표시한다. 토큰은 사용자-특정 토큰일 수 있거나 또는 SME를 이용하여 변환된 애플리케이션의 각각의 인스턴스에 대해 랜덤하게 생성될 수 있다. 영역(510E)은 수정된 어셈블리 소스 파일들(helloworld-sme-helloworld.s 및 examplelib-sme-helloworld.s)이 'as' 어셈블러로 어셈블링되는 것을 도시한다. 'as' 어셈블러는 오브젝트 파일들 helloworld-sme-helloworld.o 및 examplelib-sme-helloworld.o를 출력한다. 이 오브젝트 파일들은 예컨대, 커맨드 cc -o /mnt/src/sme/test/binaries/x86_64/helloworld-sme /mnt/src/sme/test/pcfi/src/helloworld-sme-helloworld.o /mnt/src/sme/test/pcfi/src/examplelib-sme-helloworld.o를 사용하여 실행가능한 바이너리를 형성하도록 링크된다. 컴파일된 바이너리는 "helloworld"라 칭해진다.
[0037] 도 6은 SME 도구의 동작 단계들을 도시하는 프로세스의 흐름도이다. 구체적으로, 단계들(602, 604, 606, 608, 및 610)은 개시된 SME 사전 프로세싱 도구의 실시예에 의해 수행될 수 있다. 단계들(612, 614, 616, 618, 및 620)은 개시된 SME 변환 도구의 실시예에 의해 수행될 수 있다. SME 사전 프로세싱 도구 및 SME 변환 도구가 SME 도구의 일부이기 때문에, 흐름도에 의해 수행되는 단계들은 SME 도구에 의해 수행되는 것으로 간주된다. 단계(602)에서, SME 도구는 빌드와 연관된 어셈블리 소스 파일들의 리스트를 갖는 파일을 수신한다. "-S" 옵션을 이용하여 컴파일러를 인보크(invoke)함으로써, 리스트 내의 파일들의 어셈블리 소스 코드가 생성된다. 어셈블리 소스 파일들의 리스트는 리스트 내의 어셈블리 소스 파일들의 filepath를 포함할 수 있다. 단계(604)에서, SME 도구는 어셈블리 소스 파일들의 리스트를 갖는 파일을 연다. 단계(606)에서, SME 도구는 어셈블리 소스 파일에 특정한 속성들을 식별하기 위해 리스트에 명명된 어셈블리 소스 파일을 파싱한다. 속성들의 일 예는 어셈블리 소스 파일에서의 함수들일 수 있다. 예컨대, SME 도구는 함수 엔트리 및 함수 리턴의 위치들에서 수정들을 추가함으로써 (이를테면, 직접 또는 간접 함수 호출들을 사용하여) 레지스터-기반 함수 호출들에 대한 수정들을 추가할 수 있다. 수정들은 또한 호출 사이트에서 예컨대, 함수들이 호출되는 어셈블리 소스 코드의 위치들에서 추가될 수 있다. 수정들의 일부로서, 토큰(예컨대, 사용자-특정되거나 또는 랜덤으로 생성됨)이 함수 엔트리 및 함수 리턴의 위치들에 삽입된다. 검사가 토큰의 존재를 결정하면, 검사의 결과는 유효하다. 그러나, 검사가 어떠한 토큰도 결정하지 않거나 또는 비매칭 토큰을 결정하면, 검사의 결과는 무효하다. 일부 구현들에서, 수정들을 수행하기 위해 삽입된 코드의 사이즈를 감소시키기 위해, 토큰 비교 헬퍼 함수가 사용된다. 단계(608)에서, SME 도구는 어셈블리 소스 파일에 특정한 속성들의 이름들을 (예컨대, SME 데이터베이스 파일에) 기록한다. 단계(610)에서, SME 도구는 리스트 내의 어셈블리 소스 파일들 각각이 파싱/판독되었는지를 결정한다. SME 도구가 리스트 내의 모든 파일들이 파싱되지 않았다고 결정하면, SME 도구는 단계(606)로 되돌아간다. 그러나, SME 도구가 리스트 내의 모든 파일들이 파싱되었다고 결정하면, SME 도구는 리스트 내의 어셈블리 소스 파일(예컨대, 데이터베이스에 저장됨)을 연다(단계(612)). 단계(614)에서, 어셈블리 소스 파일과 연관된 속성들의 이름들(예컨대, 함수 이름들)을 리트리브한다. 단계(616)에서, SME 도구는 어셈블리 소스 파일과 연관된 속성들에 하나 이상의 변환들을 적용함으로써 어셈블리 소스 파일을 수정한다. 단계(618)에서, SME 도구는 변환들을 적용함으로써 수정된 어셈블리 소스 파일을 (예컨대, SME 데이터베이스에) 저장한다. 단계(620)에서, SME 도구는 리스트 내의 모든 파일들이 파싱되었는지를 결정한다. SME 도구가 모든 어셈블리 소스 파일들이 파싱되지 않았다고 결정하는 경우, SME 도구는 단계(612)로 되돌아간다. SME 도구가 모든 어셈블리 소스 파일들이 파싱되었다고 결정하는 경우, 수정된 어셈블리 소스 파일들(예컨대, 어셈블러 as를 사용함)이 어셈블링된다.
[0038] 본 문서의 일부 실시예들은 이제 조항-기반 포맷으로 제시된다.
[0039] 조항 1. 미래의 사이버 공격들로부터 소스 코드를 보호하기 위해 소스 코드를 사이버 하드닝하는 방법은,
[0040] 소스 코드와 연관된 파일을 수신하는 단계 ― 파일은 어셈블리 소스 파일들의 리스트를 포함함 ― ;
[0041] 어셈블리 소스 파일에 특정한 속성들을 식별하기 위해 리스트에 어셈블리 소스 파일을 파싱하는 단계;
[0042] 어셈블리 소스 파일에 특정한 속성들의 이름들을 리트리브하는 단계;
[0043] 수정된 어셈블리 소스 파일을 생성하기 위해 어셈블리 소스 파일에 특정한 속성들에 하나 이상의 변환들을 적용함으로써 어셈블리 소스 파일을 수정하는 단계 ― 어셈블리 소스 파일의 하나 이상의 변환들은 소스 코드를 개발하는 데 사용되는 프로그래밍 언어에 대해 불가지론적임 ― ; 및
[0044] 소스 코드에 대응하는 오브젝트 파일을 생성하기 위해, 어셈블러 프로그램을 사용하여, 수정된 어셈블리 소스 파일을 어셈블링하는 단계를 포함한다.
[0045] 조항 2. 조항 1의 방법에 있어서, 어셈블리 소스 파일에 특정한 속성들은 어셈블리 소스 파일에서의 함수들을 포함하며, 방법은,
[0046] 어셈블리 소스 파일에서의 함수들 중 적어도 하나에 대한 비표준 호출들 및 함수들 중 적어도 하나에 의해 사용되는 데이터에 대한 레퍼런스들을 검출하는 단계 ― 데이터는 리스트 내의 하나 초과의 어셈블리 소스 파일에 걸쳐 공유됨 ― ; 및
[0047] 함수들 중 적어도 하나의 이름을 데이터베이스 파일에 기록하는 단계를 더 포함한다.
[0048] 조항 3. 조항 2의 방법에 있어서, 하나 이상의 변환들은 토큰이며, 방법은,
[0049] 함수들 중 적어도 하나의 이름을 식별하기 위해 데이터베이스 파일을 판독하는 단계;
[0050] (i) 함수들 중 적어도 하나로의 엔트리 포인트 및 (ii) 함수들 중 적어도 하나로부터의 어셈블리 소스 파일에서의 리턴 포인트에 토큰을 추가하는 단계 ― 후속 시간 인스턴트(time instant)에서, 토큰의 검출 실패는 소스 코드가 손상되는 것을 표시함 ― ; 및
[0051] 어셈블리 소스 파일에 토큰을 추가함으로써 수정되는 수정된 어셈블리 소스 파일을 저장하는 단계를 더 포함한다.
[0052] 조항 4. 조항 3의 방법에 있어서, 토큰은 사전 결정된 길이의 사용자-특정 바이너리 수이다.
[0053] 조항 5. 조항 3의 방법에 있어서, 토큰은 사전 결정된 길이의 랜덤하게 생성된 바이너리 수이다.
[0054] 조항 6. 조항 1의 방법에 있어서, 어셈블리 소스 파일의 하나 이상의 변환들은 소스 코드를 실행하는 데 사용되는 운영 시스템에 대해 불가지론적이다.
[0055] 조항 7. 조항 1의 방법에 있어서, 소스 코드를 개발하는 데 사용되는 프로그래밍 언어는 C++, Pascal, Fortran, 또는 Objective C를 포함한다.
[0056] 조항 8. 조항 1의 방법에 있어서, 어셈블리 소스 파일의 하나 이상의 변환들은 오브젝트 파일을 사용하여 생성된 수정된 실행가능한 코드를 초래한다.
[0057] 조항 9. 조항 8의 방법에 있어서, 하나 이상의 변환들은 실행가능한 코드가 사용되는 개발 환경에서 식별가능하다.
[0058] 조항 10. 조항 8의 방법에 있어서, 실행가능한 코드의 수정은 소스 코드에 대한 추가 사이버 하드닝 동작들의 수행을 가능하게 한다.
[0059] 조항 11. 조항 1의 방법에 있어서, 하나 이상의 변환들을 적용하는 것으로부터 생성된 수정된 어셈블리 소스 파일은 수정된 어셈블리 소스 파일의 빌드 프로세스로 끊김 없이 통합한다.
[0060] 조항 12. 조항 11의 방법에 있어서,
[0061] 빌드 프로세스 동안, 어셈블리 소스 파일의 하나 이상의 변환들을 제거하는 단계를 더 포함한다.
[0062] 조항 13. 미래의 사이버 공격들로부터 소스 코드를 보호하기 위해 소스 코드를 사이버 하드닝하기 위한 명령들이 저장된 비일시적 컴퓨터 판독가능한 저장 매체로서, 명령들은, 전자 디바이스의 프로세서에 의해 실행될 때, 프로세서로 하여금:
[0063] 소스 코드와 연관된 파일을 수신하게 하고 ― 파일은 어셈블리 소스 파일들의 리스트를 포함함 ― ;
[0064] 어셈블리 소스 파일에 특정한 속성들을 식별하기 위해 리스트에 어셈블리 소스 파일을 파싱하게 하고;
[0065] 어셈블리 소스 파일에 특정한 속성들의 이름들을 리트리브하게 하고;
[0066] 수정된 어셈블리 소스 파일을 생성하기 위해 어셈블리 소스 파일에 특정한 속성들에 하나 이상의 변환들을 적용함으로써 어셈블리 소스 파일을 수정하게 하고 ― 어셈블리 소스 파일의 하나 이상의 변환들은 소스 코드를 개발하는 데 사용되는 프로그래밍 언어에 대해 불가지론적임 ― ; 그리고
[0067] 소스 코드에 대응하는 오브젝트 파일을 생성하기 위해, 어셈블러 프로그램을 사용하여, 수정된 어셈블리 소스 파일을 어셈블링하게 한다.
[0068] 조항 14. 조항 13의 비일시적 컴퓨터 판독가능한 저장 매체에 있어서, 어셈블리 소스 파일에 특정한 속성들은 어셈블리 소스 파일에서의 함수들을 포함하며, 명령들은,
[0069] 어셈블리 소스 파일에서의 함수들 중 적어도 하나에 대한 비표준 호출들 및 함수들 중 적어도 하나에 의해 사용되는 데이터에 대한 레퍼런스들을 검출하고 ― 데이터는 리스트 내의 하나 초과의 어셈블리 소스 파일에 걸쳐 공유됨 ― ; 그리고
[0070] 함수들 중 적어도 하나의 이름을 데이터베이스 파일에 기록하기 위한 명령들을 더 포함한다.
[0071] 조항 15. 조항 13의 비일시적 컴퓨터 판독가능한 저장 매체에 있어서, 하나 이상의 변환들은 토큰이며, 명령들은,
[0072] 함수들 중 적어도 하나의 이름을 식별하기 위해 데이터베이스 파일을 판독하고;
[0073] (i) 함수들 중 적어도 하나로의 엔트리 포인트 및 (ii) 함수들 중 적어도 하나로부터의 어셈블리 소스 파일에서의 리턴 포인트에 토큰을 추가하고 ― 후속 시간 인스턴트에서, 토큰의 검출 실패는 소스 코드가 손상되는 것을 표시함 ― ; 그리고
[0074] 어셈블리 소스 파일에 토큰을 추가함으로써 수정되는 수정된 어셈블리 소스 파일을 저장하기 위한 명령들을 더 포함한다.
[0075] 본원에서 설명된 실시예들 중 일부는, 네트워킹된 환경들에서 컴퓨터들에 의해 실행되는 프로그램 코드와 같은 컴퓨터 실행가능한 명령들을 포함하는 컴퓨터 판독가능한 매체에서 구현되는, 컴퓨터 프로그램 제품에 의해 일 실시예에서 구현될 수 있는 방법들 또는 프로세스들의 일반적 맥락에서 설명된다. 컴퓨터 판독가능한 매체는 ROM(Read Only Memory), RAM(Random Access Memory), CD(compact disc)들, DVD(digital versatile disc) 등을 포함하는(그러나 이에 제한되지 않음) 탈착식 및 비탈착식 저장 디바이스들을 포함할 수 있다. 따라서, 컴퓨터 판독가능한 매체들은 비일시적 저장 매체들을 포함할 수 있다. 일반적으로, 프로그램 모듈들은 특정 태스크들을 수행하거나 또는 특정 추상 데이터 타입들을 구현하는 루틴들, 프로그램들, 오브젝트들, 컴포넌트들, 데이터 구조들 등을 포함할 수 있다. 컴퓨터 또는 프로세서 실행가능한 명령들, 연관된 데이터 구조들, 및 프로그램 모듈들은 본원에서 개시된 방법들의 단계들을 실행하기 위한 프로그램 코드의 예들을 표현한다. 그러한 실행가능한 명령들 또는 연관된 데이터 구조들의 특정 시퀀스는 그러한 단계들 또는 프로세스들에서 설명된 기능들을 구현하기 위한 대응하는 동작들의 예들을 표현한다.
[0076] 개시된 실시예들 중 일부는 하드웨어 회로들, 소프트웨어, 또는 이들의 조합들을 사용하여 디바이스들 또는 모듈들로서 구현될 수 있다. 예컨대, 하드웨어 회로 구현은 예컨대, 인쇄 회로 보드의 일부로서 통합되는 이산 아날로그 및/또는 디지털 컴포넌트들을 포함할 수 있다. 대안적으로 또는 부가적으로, 개시된 컴포넌트들 또는 모듈들은 ASIC(Application Specific Integrated Circuit)로서 그리고/또는 FPGA(Field Programmable Gate Array) 디바이스로서 구현될 수 있다. 일부 구현들은 추가적으로 또는 대안적으로, 본 출원의 개시된 기능성들과 연관된 디지털 신호 프로세싱의 동작 요구들을 위해 최적화된 아키텍처를 갖는 특수화된 마이크로프로세서인 DSP(digital signal processor)를 포함할 수 있다. 유사하게, 각각의 모듈 내의 다양한 컴포넌트들 또는 서브컴포넌트들은 소프트웨어, 하드웨어 또는 펌웨어로 구현될 수 있다. 모듈들 및/또는 모듈들 내의 컴포넌트들 사이의 연결은 적절한 프로토콜들을 사용하여 인터넷, 유선, 또는 무선 네트워크들을 통한 통신들을 포함하는(그러나 이에 제한되지 않음), 당해 기술 분야에 알려져 있는 연결 방법들 및 매체들 중 임의의 하나를 사용하여 제공될 수 있다.
[0077] 실시예들에 대한 전술된 설명은 예시 및 설명을 목적으로 제시되었다. 전술된 설명은 포괄적이거나 본 발명의 실시예들을 개시된 정확한 형태로 제한하는 것으로 의도되지 않고, 위의 교시들에 비추어 수정들 및 변형들이 가능하거나 또는 다양한 실시예들의 실시로부터 포착될 수 있다. 본원에서 논의된 실시예들은, 다양한 실시예들의 원리들 및 특성, 및 당업자가 다양한 실시예들에서 그리고 고려되는 특정 용도에 적합한 것으로서 다양한 수정들과 함께 본 발명을 이용하는 것을 가능하게 하기 위한 그것의 실제적 애플리케이션을 설명하기 위해 선택되고 설명되었다. 본원에서 설명된 실시예들의 특징들은 방법들, 장치, 모듈들, 시스템들, 및 컴퓨터 프로그램 제품들의 모든 가능한 조합들로 조합될 수 있다.

Claims (15)

  1. 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 상기 소스 코드를 사이버 하드닝(cyberharden)하는 방법으로서,
    상기 소스 코드와 연관된 파일을 수신하는 단계 ― 상기 파일은 어셈블리 소스 파일들의 리스트를 포함함 ― ;
    어셈블리 소스 파일에 특정한 속성들을 식별하기 위해 상기 리스트에 상기 어셈블리 소스 파일을 파싱하는 단계;
    상기 어셈블리 소스 파일에 특정한 속성들의 이름들을 리트리브하는 단계;
    수정된 어셈블리 소스 파일을 생성하기 위해 상기 어셈블리 소스 파일에 특정한 속성들에 하나 이상의 변환들을 적용함으로써 상기 어셈블리 소스 파일을 수정하는 단계 ― 상기 어셈블리 소스 파일의 하나 이상의 변환들은 상기 소스 코드를 개발하는 데 사용되는 프로그래밍 언어에 대해 불가지론적임(agnostic) ― ; 및
    상기 소스 코드에 대응하는 오브젝트 파일을 생성하기 위해, 어셈블러 프로그램을 사용하여, 상기 수정된 어셈블리 소스 파일을 어셈블링하는 단계를 포함하는, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  2. 제1 항에 있어서,
    상기 어셈블리 소스 파일에 특정한 속성들은 상기 어셈블리 소스 파일에서의 함수들을 포함하며,
    상기 방법은,
    상기 어셈블리 소스 파일에서의 함수들 중 적어도 하나에 대한 비표준 호출들 및 상기 함수들 중 적어도 하나에 의해 사용되는 데이터에 대한 레퍼런스(reference)들을 검출하는 단계 ― 상기 데이터는 상기 리스트 내의 하나 초과의 어셈블리 소스 파일에 걸쳐 공유됨 ― ; 및
    상기 함수들 중 적어도 하나의 이름을 데이터베이스 파일에 기록하는 단계를 더 포함하는, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  3. 제2 항에 있어서,
    상기 하나 이상의 변환들은 토큰이며,
    상기 방법은,
    상기 함수들 중 적어도 하나의 이름을 식별하기 위해 상기 데이터베이스 파일을 판독하는 단계;
    (i) 상기 함수들 중 적어도 하나로의 엔트리 포인트 및 (ii) 상기 함수들 중 적어도 하나로부터의 상기 어셈블리 소스 파일에서의 리턴 포인트에 상기 토큰을 추가하는 단계 ― 후속 시간 인스턴트(time instant)에서, 상기 토큰의 검출 실패는 상기 소스 코드가 손상되는 것을 표시함 ― ; 및
    상기 어셈블리 소스 파일에 상기 토큰을 추가함으로써 수정되는 상기 수정된 어셈블리 소스 파일을 저장하는 단계를 더 포함하는, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  4. 제3 항에 있어서,
    상기 토큰은 사전 결정된 길이의 사용자-특정 바이너리 수인, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  5. 제3 항에 있어서,
    상기 토큰은 사전 결정된 길이의 랜덤하게 생성된 바이너리 수인, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  6. 제1 항에 있어서,
    상기 어셈블리 소스 파일의 하나 이상의 변환들은 상기 소스 코드를 실행하는 데 사용되는 운영 시스템에 대해 불가지론적인, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  7. 제1 항에 있어서,
    상기 소스 코드를 개발하는 데 사용되는 프로그래밍 언어는 C++, Pascal, Fortran, 또는 Objective C를 포함하는, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  8. 제1 항에 있어서,
    상기 어셈블리 소스 파일의 하나 이상의 변환들은 상기 오브젝트 파일을 사용하여 생성된 수정된 실행가능한 코드를 초래하는, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  9. 제8 항에 있어서,
    상기 하나 이상의 변환들은 상기 실행가능한 코드가 사용되는 개발 환경에서 식별가능한, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  10. 제8 항에 있어서,
    상기 실행가능한 코드의 수정은 상기 소스 코드에 대한 추가 사이버 하드닝 동작들의 수행을 가능하게 하는, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  11. 제1 항에 있어서,
    하나 이상의 변환들을 적용하는 것으로부터 생성된 상기 수정된 어셈블리 소스 파일은 상기 수정된 어셈블리 소스 파일의 빌드 프로세스로 끊김 없이 통합하는, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  12. 제11 항에 있어서,
    상기 빌드 프로세스 동안, 상기 어셈블리 소스 파일의 하나 이상의 변환들을 제거하는 단계를 더 포함하는, 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 소스 코드를 사이버 하드닝하는 방법.
  13. 미래의 사이버 공격들로부터 소스 코드를 선제적으로 보호하기 위해 상기 소스 코드를 사이버 하드닝하기 위한 명령들이 저장된 비일시적 컴퓨터 판독가능한 저장 매체로서, 상기 명령들은, 전자 디바이스의 프로세서에 의해 실행될 때, 상기 프로세서로 하여금:
    상기 소스 코드와 연관된 파일을 수신하게 하고 ― 상기 파일은 어셈블리 소스 파일들의 리스트를 포함함 ― ;
    어셈블리 소스 파일에 특정한 속성들을 식별하기 위해 상기 리스트에 상기 어셈블리 소스 파일을 파싱하게 하고;
    상기 어셈블리 소스 파일에 특정한 속성들의 이름들을 리트리브하게 하고;
    수정된 어셈블리 소스 파일을 생성하기 위해 상기 어셈블리 소스 파일에 특정한 속성들에 하나 이상의 변환들을 적용함으로써 상기 어셈블리 소스 파일을 수정하게 하고 ― 상기 어셈블리 소스 파일의 하나 이상의 변환들은 상기 소스 코드를 개발하는 데 사용되는 프로그래밍 언어에 대해 불가지론적임 ― ; 그리고
    상기 소스 코드에 대응하는 오브젝트 파일을 생성하기 위해, 어셈블러 프로그램을 사용하여, 상기 수정된 어셈블리 소스 파일을 어셈블링하게 하는, 비일시적 컴퓨터 판독가능한 저장 매체.
  14. 제13 항에 있어서,
    상기 어셈블리 소스 파일에 특정한 속성들은 상기 어셈블리 소스 파일에서의 함수들을 포함하며,
    상기 명령들은,
    상기 어셈블리 소스 파일에서의 함수들 중 적어도 하나에 대한 비표준 호출들 및 상기 함수들 중 적어도 하나에 의해 사용되는 데이터에 대한 레퍼런스들을 검출하고 ― 상기 데이터는 상기 리스트 내의 하나 초과의 어셈블리 소스 파일에 걸쳐 공유됨 ― ; 그리고
    상기 함수들 중 적어도 하나의 이름을 데이터베이스 파일에 기록하기 위한 명령들을 더 포함하는, 비일시적 컴퓨터 판독가능한 저장 매체.
  15. 제13 항에 있어서,
    상기 하나 이상의 변환들은 토큰이며,
    상기 명령들은,
    함수들 중 적어도 하나의 이름을 식별하기 위해 데이터베이스 파일을 판독하고;
    (i) 상기 함수들 중 적어도 하나로의 엔트리 포인트 및 (ii) 상기 함수들 중 적어도 하나로부터의 상기 어셈블리 소스 파일에서의 리턴 포인트에 상기 토큰을 추가하고 ― 후속 시간 인스턴트에서, 상기 토큰의 검출 실패는 상기 소스 코드가 손상되는 것을 표시함 ― ; 그리고
    상기 어셈블리 소스 파일에 상기 토큰을 추가함으로써 수정되는 상기 수정된 어셈블리 소스 파일을 저장하기 위한 명령들을 더 포함하는, 비일시적 컴퓨터 판독가능한 저장 매체.
KR1020217037438A 2019-04-18 2020-04-20 소스 수정 엔진 KR20220047928A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US201962835625P 2019-04-18 2019-04-18
US62/835,625 2019-04-18
PCT/US2020/028975 WO2020215072A1 (en) 2019-04-18 2020-04-20 Source modification engine

Publications (1)

Publication Number Publication Date
KR20220047928A true KR20220047928A (ko) 2022-04-19

Family

ID=72837965

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020217037438A KR20220047928A (ko) 2019-04-18 2020-04-20 소스 수정 엔진

Country Status (4)

Country Link
US (1) US20220179930A1 (ko)
EP (1) EP3956793A4 (ko)
KR (1) KR20220047928A (ko)
WO (1) WO2020215072A1 (ko)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11720474B2 (en) * 2020-12-21 2023-08-08 RunSafe Security, Inc. System and methods for post mortem debugging of transformed binaries
US11693760B2 (en) * 2020-12-21 2023-07-04 RunSafe Security, Inc. System and methods for live debugging of transformed binaries

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2008088073A1 (en) * 2007-01-18 2008-07-24 Panasonic Corporation Obfuscation assisting apparatus
US8434059B2 (en) * 2009-05-01 2013-04-30 Apple Inc. Systems, methods, and computer-readable media for fertilizing machine-executable code
US8635607B2 (en) * 2011-08-30 2014-01-21 Microsoft Corporation Cloud-based build service
US9116712B2 (en) * 2013-02-28 2015-08-25 Microsoft Technology Licensing, Llc Compile based obfuscation
CA2930424C (en) * 2013-11-12 2021-08-24 Andrew Michael Wesie Improved control flow integrity system and method
US10007498B2 (en) * 2015-12-17 2018-06-26 Architecture Technology Corporation Application randomization mechanism
CN107908955B (zh) * 2017-11-30 2019-11-12 华中科技大学 一种基于中间语言分析的控制流完整性保护方法及系统

Also Published As

Publication number Publication date
US20220179930A1 (en) 2022-06-09
WO2020215072A1 (en) 2020-10-22
EP3956793A4 (en) 2023-01-04
EP3956793A1 (en) 2022-02-23

Similar Documents

Publication Publication Date Title
US7823144B2 (en) Computer program code comparison using lexemes
EP3234851B1 (en) A system and method for facilitating static analysis of software applications
US5960197A (en) Compiler dispatch function for object-oriented C
Yadavalli et al. Raising binaries to LLVM IR with MCTOLL (WIP paper)
CN102867144B (zh) 一种用于检测和清除计算机病毒的方法和装置
US20190180037A1 (en) Method and system for identifying functional attributes that change the intended operation of a compiled binary extracted from a target system
CN112905447B (zh) 一种区块链虚拟机的测试方法和系统
KR20220047928A (ko) 소스 수정 엔진
US11693760B2 (en) System and methods for live debugging of transformed binaries
JP2010515955A (ja) メインフレームシステムのアプリケーションプログラムを開放型システムに適したアプリケーションプログラムに変換するマイグレイション装置及びその方法
US20180267783A1 (en) Apparatus and method to facilitate extraction of unused symbols in a program source code
CN111782239B (zh) 软件打包和源码版本信息获取方法、装置及存储介质
CN111061486A (zh) 一种安卓应用程序增量方法
KR20220041040A (ko) 소스 수정 엔진의 자동화된 통합
US11720474B2 (en) System and methods for post mortem debugging of transformed binaries
US11983265B2 (en) Automated integration of a source modification engine
CN114816436A (zh) 一种基于反汇编的源码解析装置
US7774767B2 (en) System and method for compiler interprocedural optimization having support for object files in libraries
Ferrara et al. Sarl: Oo framework specification for static analysis
JP3266097B2 (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
KR101585044B1 (ko) 프로그래밍 언어 통합 처리 시스템
US8453108B1 (en) Static, configurable kernel interface
Yadegari et al. Control dependencies in interpretive systems
Silberg Machine code database for matching embedded libraries
Nellaiyapen Practical WebAssembly: Explore the fundamentals of WebAssembly programming using Rust