KR101434860B1 - 해시를 이용한 동적코드의 무결성 검증 방법 - Google Patents
해시를 이용한 동적코드의 무결성 검증 방법 Download PDFInfo
- Publication number
- KR101434860B1 KR101434860B1 KR20130097412A KR20130097412A KR101434860B1 KR 101434860 B1 KR101434860 B1 KR 101434860B1 KR 20130097412 A KR20130097412 A KR 20130097412A KR 20130097412 A KR20130097412 A KR 20130097412A KR 101434860 B1 KR101434860 B1 KR 101434860B1
- Authority
- KR
- South Korea
- Prior art keywords
- hash
- function
- code
- binary
- security tag
- Prior art date
Links
- 238000000034 method Methods 0.000 title claims abstract description 75
- 230000006870 function Effects 0.000 claims abstract description 124
- 238000000605 extraction Methods 0.000 claims abstract description 13
- 238000012795 verification Methods 0.000 claims description 32
- 238000004590 computer program Methods 0.000 description 18
- 238000010586 diagram Methods 0.000 description 10
- 238000004891 communication Methods 0.000 description 8
- 230000018109 developmental process Effects 0.000 description 7
- 238000011161 development Methods 0.000 description 5
- 238000004422 calculation algorithm Methods 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 239000000284 extract Substances 0.000 description 2
- 238000007689 inspection Methods 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 238000006731 degradation reaction Methods 0.000 description 1
- 230000006866 deterioration Effects 0.000 description 1
- 230000012447 hatching Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000010998 test method Methods 0.000 description 1
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
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
-
- 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/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
-
- 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44589—Program code verification, e.g. Java bytecode verification, proof-carrying code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Computer Hardware Design (AREA)
- Technology Law (AREA)
- Multimedia (AREA)
- Quality & Reliability (AREA)
- Storage Device Security (AREA)
- Stored Programmes (AREA)
Abstract
해시를 이용한 동적코드의 무결성을 검증하는 방법 및 그 기록매체를 개시한다.
프로그램의 일부인 특정함수(보안이 필요한 함수)에 대해서만 보안태그를 설정하는 과정; 보안태그가 적용된 함수를 적어도 하나 이상 포함하는 소스코드를 컴파일하여 바이너리를 생성하는 바이너리 생성 과정; 상기 바이너리를 검색하여, 상기 보안태그가 발견되면, 상기 보안태그를 포함하는 상기 특정함수의 코드 블록에 대한 해시코드를 추출하는 메모리해시 추출 과정; 및 상기 메모리해시 추출 과정에서 생성된 적어도 하나 이상 함수의 해시코드를 포함하는 해시레지스트리를 생성하는 해시레지스트리 생성 과정을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법을 제공한다.
Description
본 발명은 해시를 이용한 동적코드의 무결성을 검증하는 방법에 관한 것이다.
이하에 기술되는 내용은 단순히 본 실시예와 관련되는 배경 정보만을 제공할 뿐 종래기술을 구성하는 것이 아님을 밝혀둔다.
최근 들어 타인의 컴퓨터에 침입하여 정보를 유출하거나, 역분석(reverse engineering) 기술을 이용하여 컴퓨터프로그램이 본래 의도된 기능과 다른 기능을 수행하도록 컴퓨터프로그램의 바이너리 코드를 변조하거나, 디버거와 같은 도구를 사용하여 컴퓨터프로그램이 실행되는 도중에 바이너리 코드를 변조하여 이를 악용하는 사례가 빈번히 일어나고 있다. 예를 들어, 프로그램를 변조하는 자는 온라인 게임의 사용자 PC에서 동작하는 클라이언트 프로그램을 역분석하여, 클라언트 프로그램이 자동적으로 수행되도록 변조한다면 비정상적인 방법으로 게임 아이템을 획득할 수도 있을 것이다. 컴퓨터프로그램이 변조되었는지 여부는 컴퓨터프로그램이 실행되기 전까지는 파악하기 어렵거니와 발견하더라도 대처하기 곤란하므로, 컴퓨터프로그램이 실행되는 도중에 컴퓨터프로그램이 변조되었는지 여부를 검사하고 조치를 취할 필요가 있다.
컴퓨터프로그램은 바이너리 형태로 보조기억장치에 저장되어 있다가 실행되기 위해 메인메모리에 로드된다. 메인메모리에 로드된 바이너리는 원본 상태를 항상 유지할 수 있어야 한다. 그러나 역분석을 통하여 바이너리를 변조하여 실행하거나, 디버거와 같은 도구를 이용하여 컴퓨터프로그램이 실행되는 도중에 변조한다면 원본 상태를 유지할 수 없을 것이다.
위와 같은 문제를 해결하기 위해 종래에는 컴퓨터프로그램의 바이너리가 보조기억장치에 파일의 형태로 저장되어 있을 때 파일 전체에 대한 해시를 구해 파일이 변조되었는지 여부를 검증하거나, 메인메모리에 로드된 바이너리 전체 또는 일부에 대해 해시를 구해 변조되었는지 여부를 주기적으로 검사하여 바이너리의 무결성을 검증하였다. 전자를 파일해시에 의한 검사 방법이라고 하며 후자를 메모리해시에 의한 검사 방법이라고 한다. 메모리해시에 의한 검사 방법은 일정한 시간 간격으로 반복적으로 수행해야만 원하는 목적을 달성할 수 있는 방법이다. 이로 인해 메모리해시에 의한 검사 방법은 프로그램 실행 성능과 해시를 수행하는 시스템 성능을 저하시키는 요인으로 작용할 수 있다.
따라서 종래의 메모리해시를 바이너리 코드의 무결성 검증 방법으로 사용하는 경우, 컴퓨터프로그램의 실행 성능 또는 시스템의 성능에 민감한 경우에는 적용하기 어렵다는 문제가 있다.
본 실시예는, 바이너리의 전체 또는 일부를 주기적 또는 반복적으로 무결성 검증하는 것이 아니라, 보안태그가 적용된 함수가 호출될 경우에만 함수 단위로 무결성 검증을 하도록 하여, 무결성 검증으로 인한 프로그램 실행의 성능 저하를 방지하는 방법을 제공하는 데 주된 목적이 있다.
본 실시예의 일 측면에 의하면, 프로그램의 일부인 특정함수(보안이 필요한 함수)에 대해서만 보안태그를 설정하는 과정; 보안태그가 적용된 함수를 적어도 하나 이상 포함하는 소스코드를 컴파일하여 바이너리를 생성하는 바이너리 생성 과정; 상기 바이너리를 검색하여, 상기 보안태그가 발견되면, 상기 보안태그를 포함하는 상기 특정함수의 코드 블록에 대한 해시코드를 추출하는 메모리해시 추출 과정; 및 상기 메모리해시 추출 과정에서 생성된 적어도 하나 이상 함수의 해시코드를 포함하는 해시레지스트리를 생성하는 해시레지스트리 생성 과정을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법을 제공한다.
또한, 본 실시예의 다른 측면에 의하면, 보안태그가 적용된 함수를 적어도 하나 이상 포함하는 바이너리를 메인메모리에 로드하는 과정; 상기 바이너리가 상기 메인메모리에서 실행되는 과정에서, 상기 보안태그를 포함하는 특정함수가 호출되어, 상기 보안태그가 발견되면, 상기 함수의 코드 블록에 대한 해시코드를 추출하는 메모리해시 추출 과정; 상기 해시코드와 해시레지스트리에 저장되어 있는 적어도 하나 이상 함수의 해시코드 포함하는 해시코드테이블 중 어느 하나와의 일치 여부를 확인하여 상기 특정함수가 변조되었는지 여부를 판단하는 함수 변조 판단 과정; 및 상기 함수 변조 판단 과정의 결과 상기 특정함수가 변조되었다고 판단된 경우, 상기 바이너리의 실행을 중지하는 과정을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법을 제공한다.
이상에서 설명한 바와 같이 본 실시예에 의하면, 메인메모리에 로드된 컴퓨터프로그램의 바이너리가 변조되었는지 여부를 검사하기 위해 주기적 또는 반복적으로 바이너리의 전체 또는 일부에 대해 해시코드를 구하는 경우, 해시 계산에 대한 부담으로 인해 컴퓨터프로그램의 실행 성능 및 시스템 성능이 저하된다. 더욱이 실행 속도가 민감한 컴퓨터프로그램인 경우라면 위와 같은 방식은 적용되기 곤란하다.
프로그램의 실행 성능에 민감하면서 바이너리 변조에 대한 보안이 필요한 컴퓨터프로그램의 실행에 있어서, 메모리해시를 이용한 무결성 검증을 위하여 보호가 필요한 중요한 함수에 보안태그를 적용하고, 보안태그가 적용된 함수가 호출될 경우에, 함수에 대해서만 메모리해시를 이용하여 바이너리의 변조 여부를 검사한다면 위와 같은 문제를 해결할 수 있다. 즉, 주기적 또는 반복적으로 메모리해시를 이용하여 무결성을 검사하는 방법 보다는 보안태그가 적용된 함수가 실행될 경우에만 함수의 무결성을 검증하게 되면, 검증의 유효성이 높아지고, 프로그램의 실행 성능 저하도 최소화 될 것이다.
비록 보안태그가 적용된 함수가 반복적으로 호출되더라도, 함수의 무결성 검증이 수행된 이후에 다시 같은 함수가 호출된 경우, 일정한 시간 간격 내에서는 무결성 검사가 생략되도록 하여, 반복적으로 함수가 호출될 경우의 문제는 해결될 수 있다.
게다가, 종래의 메모리해시를 이용한 무결성 검증 방법과는 달리, 함수 단위의 보안태그가 적용된 바이너리와 해시코드로 구성된 해시레지스트리가 함께 배포되므로 변조 여부를 판단하기 위한 별도의 원본을 획득하기 위한 과정이 필요하지 않고, 함수가 호출 될 경우에 함수 내에서 무결성 검사가 수행되므로 무결성 검사를 수행하는 별도의 프로그램이 필요하지 않다. 무결성 검증을 위한 별도의 프로그램이 필요한 경우, 무결성 검증 프로그램을 무력화 시킨다면 변조된 프로그램이 실행되는 것을 방지할 수단이 사라지게 된다. 이에 비해 보안태그가 적용된 함수 단위로 무결성 검증을 할 경우, 함수가 호출되면서 무결성 검증도 이루어지므로 위와 같은 문제가 발생하지 않는다.
한편, 보안태그는 짧은 시간 간격으로 반복적으로 호출되는 함수보다는, 계정인증, 비밀번호 입력, 결제 관련, 보안관련(해시체크, 안티디버깅 등), 암호화·복호화, 인증서 검증, 상품 구매·판매, 초기화, 서버 통신, 설정파일(세이프파일) 읽고 쓰기, 연산 결과 판정 및 프로그램 실행에 있어 보호가 필요한 중요한 함수에 적합하다. 위와 같은 함수들은 일정한 주기로 반복하여 호출되지는 않는다는 특성이 있고, 반복하여 호출되더라도 함수에 대한 무결성 검증 이후, 다시 같은 함수가 호출된 경우 일정한 시간 간격 내에서는 검증이 생략될 수 있도록 할 수 있다.
도 1은 본 실시예에 따른 함수 단위의 메모리해시를 이용한 동적코드 무결성을 검증하는 개념의 개요도이다.
도 2는 본 실시예에 따른 함수 단위의 동적코드 무결성 검증을 할 수 있는 프로그램 개발 구성도이다.
도 3은 본 실시예에 따른 함수 단위의 보안태그가 적용된 바이너리에서 해시코드를 추출하고 해시레지스트리를 생성하는 과정의 순서도이다.
도 4는 본 실시예에 따른 해시레지스트의 무결성 검증을 위한 시그너쳐를 생성하는 과정의 순서도이다.
도 5는 본 실시예에 따른 보안태그가 설정된 함수에서 해시코드를 추출하여 해시레지스트리를 생성하는 과정의 예시도이다.
도 6은 본 실시예에 따른 함수 단위의 보안태그가 적용된 바이너리를 실행하는 사용자단말기의 구성도이다.
도 7은 본 실시예에 따른 함수 단위의 보안태그가 적용 바이너리에 대한 함수 단위의 무결성 검증을 수행하는 과정의 순서도이다.
도 8은 본 실시예에 따른 함수 단위의 무결성 검증을 수행하는 과정의 예시도이다.
도 2는 본 실시예에 따른 함수 단위의 동적코드 무결성 검증을 할 수 있는 프로그램 개발 구성도이다.
도 3은 본 실시예에 따른 함수 단위의 보안태그가 적용된 바이너리에서 해시코드를 추출하고 해시레지스트리를 생성하는 과정의 순서도이다.
도 4는 본 실시예에 따른 해시레지스트의 무결성 검증을 위한 시그너쳐를 생성하는 과정의 순서도이다.
도 5는 본 실시예에 따른 보안태그가 설정된 함수에서 해시코드를 추출하여 해시레지스트리를 생성하는 과정의 예시도이다.
도 6은 본 실시예에 따른 함수 단위의 보안태그가 적용된 바이너리를 실행하는 사용자단말기의 구성도이다.
도 7은 본 실시예에 따른 함수 단위의 보안태그가 적용 바이너리에 대한 함수 단위의 무결성 검증을 수행하는 과정의 순서도이다.
도 8은 본 실시예에 따른 함수 단위의 무결성 검증을 수행하는 과정의 예시도이다.
이하, 본 실시예를 첨부된 도면을 참조하여 상세하게 설명한다.
본 실시예에 따른 해시를 이용한 바이너리의 무결성을 검증하는 방법은 C/C++와 같이 네이티브 코드(native code)를 생성할 수 있는 프로그램 언어라면 PC, 서버, 스마트 폰 등 하드웨어나 Windows, UNIX, Linux, OS X 등 응용 소프트웨어가 실행되는 운영체제에 관계없이 동일하게 적용될 수 있다. 즉, 하드웨어나 운영체제와는 독립적으로 보안이 필요한 중요한 함수 단위로 무결성을 검증하게 되므로 범용성이 있고, 유효성이 높으며, 프로그램의 실행 성능에 미치는 영향도 최소화할 수 있는 무결성 검증 방법을 제공한다.
도 1은 본 실시예에 따른 함수 단위의 메모리해시를 이용한 동적코드 무결성을 검증하는 개념의 개요도이다.
본 실시예에 따른 함수 단위의 메모리해시를 이용한 바이너리의 무결성 검증 방법은, 개발용단말기(100)에서 보안태그가 적용된 함수를 포함하는 바이너리를 생성하는 과정과 바이너리에서 해시레지스트리를 생성하는 과정이 수행된다. 다만, 바이너리에서 함수 단위의 해시코드와 해시레지스트리 생성은 단일한 장비에 이루어질 필요는 없다. 보안태그가 적용된 바이너리와 해시레지스트리는 통신망이나 저장매체 등의 유통 수단을 통해 사용자에게 배포되어 사용자단말기(200)에 저장된다. 사용자단말기(200)는 보안태그가 적용된 함수를 적어도 하나 이상 포함하는 바이너리를 메인메모리에 로드하여 실행한다. 이 때 보안태그가 발견되면 보안태그를 포함하는 함수의 무결성을 검증하는 과정을 수행한다.
도 2는 본 실시예에 따른 함수 단위의 동적코드 무결성 검증을 할 수 있는 프로그램 개발 구성도이다.
이하, 도 3의 함수 단위의 보안태그 적용 과정을 참조하여 도 2의 구성 요소를 설명한다. 도 2에서 컴파일러(110), 보안적용 수단(120), 저장부(130)은 개발용단말기(100)의 내부 구성이다. 보안적용 서버(400)는 보안적용 수단(120)에서 수행하는 메모리해시 추출과정(S340)과 해시레지스트리 생성 과정(S360)을 개발용단말기(100)를 대신하여 수행할 수 있다.
컴파일러(110)는 보안태그가 적용된 함수를 적어도 하나 이상 포함하는 소스코드를 컴파일하여 바이너리를 생성한다. 보안적용 수단(120)은 컴파일러(110)가 생성한 바이너리에서 보안태그를 검색하여, 보안태그가 발견되면, 무결성 검증의 시작 지점을 표시하는 시작태그로부터 종료 지점을 표시하는 종료태그까지에 대한 해시코드를 생성하는 메모리해시 추출 과정을 수행하고(S340), 메모리해시 추출 과정에서 추출된 적어도 하나 이상의 해시코드를 포함하는 해시레지스트리를 생성한다(S360). 보안적용 수단(120)이 수행하는 메모리해시 추출 과정(S340)과 해시레지스트리 생성 과정(S360)은 개발용단말기(100)에서 수행될 수도 있지만, 바이너리 전체를 보안적용 서버(400)에 전송하고 보안적용 서버(400)에서 수행할 수도 있다. 뿐만 아니라 보안적용 수단(120)에서는 보안태그를 발견하고(S330) 시작태그로부터 종료태그까지의 코드를 보안적용 서버(400)에 전송하여, 보안적용 서버(400)로 하여금 메모리해시 추출 과정(S340)과 해시레지스트리 생성 과정(S360)을 수행하도록 할 수도 있다. 보안적용 수단(120)에 의해 생성된 해시레지스트리는 바이너리와 함께 파일의 형태로 저장부(130)에 저장된다(S360).
도 3은 본 실시예에 따른 함수 단위의 보안태그가 적용된 바이너리에서 해시코드를 추출하여 해시레지스트리를 생성하는 과정의 순서도이다.
복수의 함수를 포함하는 컴퓨터프로그램의 소소코드에서 계정인증, 비밀번호 입력, 결제 관련, 보안관련(해시체크, 안티디버깅 등), 암호화·복호화, 인증서 검증, 상품 구매 및 판매, 초기화, 서버 통신, 설정파일(세이프파일) 읽고 쓰기, 연산 결과 판정 및 프로그램 실행에 있어 보호가 필요한 중요한 함수 등 적어도 하나 이상의 함수에 보안태그를 설정한다(S300). 위와 같은 함수들은 대개 주기적으로 반복하여 호출되지 않는 특성을 가지고 있으면서도 컴퓨터프로그램을 변조하고자 하는 자들에게는 주요한 관심의 대상이다. 그러므로 위와 같은 함수에 대해서만 무결성을 검증하더라도 유효성이 매우 높고, 무결성 검증으로 인한 프로그램의 실행 성능의 저하도 최소화 할 수 있다. 보안태그가 적용된 함수를 포함하는 소스코드는 컴파일러(110)에 의해 컴파일되어 바이너리 형태로 변환된다(S310). 즉, 컴파일러(110)에 의해 바이너리 파일이 생성된다(S310)
이하, 보안적용 수단(120)에서 수행되는 과정과 저장부(130)에서 수행되는 과정에 대해 설명한다. 보안적용 수단(120)은 바이너리에서 보안태그를 검색한다(S320). 보안태그가 발견되지 않으면 바이너리의 끝에 도달하였는지를 확인하고(S350), 도달하지 않았다면 단계 S320으로 되돌아가 검색을 계속한다. 보안태그가 발견 되면, 보안태그를 포함하는 함수의 코드 블록 내에서 무결성 검사의 시작을 표시하는 시작태그와 종료를 표시하는 종료태그 사이의 코드를 해시함수(MD5, SHA, Checksum 등)의 입력으로 하여 해시코드를 추출한다(S340). 이를 메모리해시 추출 과정이라고 한다. 상기 바이너리의 마지막까지 검색을 완료하였다면(S350) 앞에서 추출한 적어도 하나 이상 함수의 해시코드로 구성된 해시코드테이블을 포함하는 해시레지스트리가 생성된다(S360). 해시레지스트리는 바이너리 파일과는 별도의 파일에 저장이 될 수도 있고, 바이너리 파일의 끝 부분에 첨부되어 저장되는 것도 가능하다.
도 4는 본 실시예에 따른 해시레지스트의 무결성 검증을 위한 시그너쳐를 생성하는 과정의 순서도이다.
해시레지스트리를 생성하는 과정(S360)은 적어도 하나 이상의 함수 단위로 추출된 해시코드를 포함하는 해시코드테이블을 해시레지스트리에 저장한다(S362). 그러나 해시레지스트리에 저장된 해시코드는 프로그램을 변조하고자 하는 자에게 노출되어 변조될 수 있다. 즉, 해시레지스트리의 무결성 검증을 위하여 해시레지스트리에 저장된 적어도 하나 이상 함수의 해시코드로 이루어진 해시코드테이블을 해시함수(MD5, SHA, Checksum 등)의 입력으로 하여 새로운 해시코드를 추출한다(S364). 추출된 해시코드를 암호화 하여 시그너쳐(signature)를 생성한다(S366). 시그너쳐는 해시레지스트리의 무결성을 검증하는 매우 중요한 부분이므로 암호화 알고리즘(AES, DES, RSA 등)으로 암호화 하여(S366) 보호될 수 있도록 하는 것이다. 시그너쳐는 해시레지스트리에 해시코드테이블과 함께 저장될 수도 있지만, 이와는 별도의 장소에 저장될 수도 있다(S368).
도 5는 본 실시예에 따른 보안태그가 설정된 함수에서 해시코드를 추출하여 해시레지스트리를 생성하는 과정의 예시도이다.
보안태그는 무결성 검증을 시작할 지점을 표시하는 시작태그와 종료 지점을 표시하는 종료태그로 구성된다. 보안태그가 적용된 함수의 코드 블록 내에서 시작태그로부터 종료태그까지의 코드를 해시함수(MD5, SHA, Checksum 등)의 입력으로 하여 해시코드를 추출하게 된다(S340). 도 5의 예시도에서 function_1 함수는 시작태그와 종료태그로 구성되는 보안태그를 포함하고 있다. function_1 함수의 시작태그로부터 종료태그까지의 코드를 해시함수인 MD5, SHA, Checksum 등의 입력으로 하면 hash 1이라는 해시코드가 추출된다(S340).
적어도 하나 이상의 함수에 보안태그가 적용되므로 해시레지스트리에 저장되는 해시코드도 적어도 하나 이상이 포함된다. 도 5의 예시도는 보안태그가 적용된 n개의 함수에 추출된 hash 1, hash 2, ··· , hash n 해시코드를 포함하는 해시코드테이블을 해시레지스트리에 저장하고(S362), 해시코드테이블을 해시함수인 MD5, SHA, Checksum 등의 입력으로 하여 해시코드를 추출하고(S364), 추출된 해시코드를 AES, DES, RSA 등 암호화 알고리즘으로 암호화 하여 시그너쳐를 생성하고(S366), 생성된 시그너쳐를 해시레지스트리 또는 별도의 장소에 저장하는(S368) 과정이다.
도 6은 본 실시예에 따른 함수 단위의 보안태그가 적용된 바이너리를 실행하는 사용자단말기의 구성도이다.
함수 단위의 보안태그가 적용된 바이너리는 배포 과정을 거쳐 사용자단말기(200)의 보조기억장치(240)에 저장된다. 바이너리가 사용자단말기(200)에서 실행될 때에는, 우선 바이너리가 메인메모리(220)에 로드되고, CPU(210)에 의해 바이너리의 명령어들이 수행되며, 그 결과가 디스플레이 장치(230)에 표시된다.
본 발명의 실시예에 따른 사용자 단말기(200)는 개인용 컴퓨터(PC: Personal Computer), 노트북 컴퓨터, 태블릿, 개인 휴대 단말기(PDA: Personal Digital Assistant), 게임 콘솔, 휴대형 멀티미디어 플레이어(PMP: Portable Multimedia Player), 플레이스테이션 포터블(PSP: PlayStation Portable), 무선 통신 단말기(Wireless Communication Terminal), 스마트폰(Smart Phone), TV, 미디어 플레이어 등과 같은 사용자 단말기일 수 있다. 본 명세서의 실시예에 따른 사용자 단말기(200)는 응용 서버와 서비스 서버 등 서버 단말기일 수 있다. 본 발명의 실시예에 따른 사용자 단말기는 각기 (i) 각종 기기 또는 유무선 통신망과 통신을 수행하기 위한 통신 모뎀 등의 통신 장치, (ii) 해시를 이용한 동적코드 검증 방법의 실행을 위해 인터 또는 인트라 예측하기 위한 각종 프로그램과 데이터를 저장하기 위한 메모리, (iii) 프로그램을 실행하여 연산 및 제어하기 위한 마이크로프로세서 등을 구비하는 다양한 장치를 의미할 수 있다. 적어도 일 실시예에 따르면, 메모리는 램(Random Access Memory: RAM), 롬(Read Only Memory: ROM), 플래시 메모리, 광 디스크, 자기 디스크, 솔리드 스테이트 디스크(Solid State Disk: SSD) 등의 컴퓨터로 판독 가능한 기록/저장매체일 수 있다. 적어도 일 실시예에 따르면, 마이크로프로세서는 명세서에 기재된 동작과 기능을 하나 이상 선택적으로 수행하도록 프로그램될 수 있다. 적어도 일 실시예에 따르면, 마이크로프로세서는 전체 또는 부분적으로 특정한 구성의 주문형반도체(application specific integrated circuit: ASIC) 등의 하드웨어로써 구현될 수 있다.
도 7은 본 실시예에 따른 함수 단위의 보안태그가 적용 바이너리에 대한 함수 단위의 무결성 검증을 수행하는 과정의 순서도이다.
함수 단위로 보안태그가 적용된 바이너리가 실행되기 위해서 메인메모리(200)에 로드된다(S710). 바이너리가 실행되면서, 보안태그가 적용된 함수가 호출되어 보안태그가 발견되면(S720) 함수의 무결성을 검증한다.
이하, 보안태그가 발견되어 함수 단위의 무결성 검증이 이루어지는 과정을 설명한다. 보안태그가 적용된 함수가 호출되어 보안태그가 발견되면, 함수에 대한 무결성 검증을 할지 여부를 판단한다(S730). 보안태그가 적용되는 함수는 계정인증, 비밀번호 입력, 결제 관련, 보안관련(해시체크, 안티디버깅 등), 암호화·복호화, 인증서 검증, 상품 구매 및 판매, 초기화, 서버 통신, 설정파일(세이프파일) 읽고 쓰기, 연산 결과 판정 및 프로그램 실행에 있어 보호가 필요한 중요한 함수에 보안태그가 적용되어 반복 호출되지 않는 특성이 있지만, 경우에 따라서는 반복적으로 호출되어 무결성 검증이 이루어질 염려가 있다. 위와 같은 경우에 대비하기 위하여 함수의 무결성 검증이 이루어진 후 일정한 시간 간격 내에서는 다시 함수의 무결성 검증을 반복하지 않도록 할 필요가 있다. 따라서 함수에 대한 무결성 검증이 이루어진 후, 일정한 시간 간격 내에서 다시 함수가 호출된다면 무결성 검증을 생략하고 다음 과정을 수행하도록 한다(S730).
또한, 해시레지스트리에 대한 무결성을 검증할 필요가 있다(S740). 해시레지스트리를 검증하기(S740) 위해서는 해시레지스트리의 생성 과정(S340)에서 시그너쳐를 생성하는(S366) 과정과 동일한 과정으로, 해시레지스트리에 저장되어 있는 적어도 하나 이상의 함수 단위의 해시코드를 포함하는 해시코드테이블에 대한 해시코드를 생성하고(S364), 암호화하여 시그너쳐를 생성하여(S366), 해시레지스트리 또는 별도의 장소에 저장된 시그너쳐와 동일한지 여부를 확인한다(S740). 만약 일치하지 않는다면 해시레지스트리가 변조된 것이므로 프로그램이 실행을 종료하는 과정으로 전이된다(S770).
함수의 무결성 검사 과정은(S750) 함수의 코드 블록 내에서 무결성 검증의 시작 지점을 표시하는 시작태그부터 종료지점을 표시하는 종료태그까지 코드에 대해 해시함수(MD5, SHA, Checksum 등)를 사용하여 해시코드를 추출하는 메모리해시 추출 과정, 메모리해시 추출 과정에서 추출된 해시코드를 암호하여 생성한 시그너쳐가 해시레지스트리 또는 별도의 장소에 저장된 시그너쳐와 일치하는지 확인하여 함수가 변조되었는지 여부를 판단하고(S750), 함수가 변조된 경우 프로그램의 종료 과정으로 전이한다(S770). 함수의 무결성 검사 과정(S750)에서 함수가 변조되지 않은 것으로 확인되면 정상적으로 함수를 실행하고, 이러한 과정은 프로그램이 종료 될 때까지 반복하게 된다(S760). 프로그램의 종료 과정(S770)에서 바이너리가 변조되어 더 이상 실행되지 못하게 경우, 바이너리에서 사용 중인 리소스들을 시스템에 반환하고, 경고 메시지 표시, 실행 중지 및 실행 종료 중 어느 하나를 할 수 있다.
도 8은 본 실시예에 따른 함수 단위의 무결성 검증을 수행하는 과정의 예시도이다.
도 8의 예시도는 함수 단위의 보안태그가 적용된 바이너리가 실행되고(S710), 보안태그를 포함하고 있는 함수인 function_1이 호출되고, function_1에서 보안태그가 발견되어(S720), 시작태그로부터 종료태그까지의 코드를 해시함수인 MD5, SHA, Checksum 등을 이용하여 해시코드인 hash 1을 추출하고, hash 1과 해시레지스트리에 저장되어 있는 hash 1, hash 2, ··· , hash n을 포함하는 해시코드테이블의 어느 하나와 일치하는지를 확인하여 function_1이 변조되었는지를 검증한다(S750). 이 때 해시레지스트를 검증하기 위해 hash 1, hash 2, ··· , hash n을 포함하는 해시코드테이블에 대한 해시코드를 추출하고 암호화 하여 시그너쳐를 생성하고, 해시레지스트리 또는 별도의 장소에 저장되어 있는 시그너쳐와 일치하는 여부를 확인하여 해시레지스트리가 변조되었는지 검증한다(S740).
이상의 설명은 본 실시예의 기술 사상을 예시적으로 설명한 것에 불과한 것으로서, 본 실시예가 속하는 기술 분야에서 통상의 지식을 가진 자라면 본 실시예의 본질적인 특성에서 벗어나지 않는 범위에서 다양한 수정 및 변형이 가능할 것이다. 따라서, 본 실시예들은 본 실시예의 기술 사상을 한정하기 위한 것이 아니라 설명하기 위한 것이고, 이러한 실시예에 의하여 본 실시예의 기술 사상의 범위가 한정되는 것은 아니다. 본 실시예의 보호 범위는 아래의 청구범위에 의하여 해석되어야 하며, 그와 동등한 범위 내에 있는 모든 기술 사상은 본 실시예의 권리범위에 포함되는 것으로 해석되어야 할 것이다.
100 개발용단말기 200 사용자단말기
210 CPU 220 메인메모리
230 보조기억장치 240 디스플레이
400 보안적용 서버
210 CPU 220 메인메모리
230 보조기억장치 240 디스플레이
400 보안적용 서버
Claims (9)
- 프로그램의 일부인 특정함수(보안이 필요한 함수)에 대해서만 보안태그를 설정하는 과정;
상기 보안태그가 적용된 함수를 적어도 하나 이상 포함하는 소스코드를 컴파일하여 바이너리를 생성하는 바이너리 생성 과정;
상기 바이너리를 검색하여, 상기 보안태그가 발견되면, 상기 특정함수의 코드 블록에 대한 해시코드를 추출하는 메모리해시 추출 과정; 및
상기 메모리해시 추출 과정에서 생성된 적어도 하나 이상 함수의 해시코드를 포함하는 해시레지스트리를 생성하는 해시레지스트리 생성 과정
을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법. - 제 1 항에 있어서,
상기 보안태그는,
상기 특정함수의 코드 블록 내에서 무결성 검사의 시작 지점 표시하는 시작태그와 종료 지점을 표시하는 종료태그를 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법. - 제 2 항에 있어서,
상기 메모리해시 추출 과정은,
상기 특정함수의 코드 블록 내에서 상기 시작태그로부터 상기 종료태그까지에 대한 해시코드를 추출하는 과정을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법. - 제 1 항에 있어서,
상기 해시레지스트리 생성 과정은,
상기 메모리해시 추출 과정에서 추출된 적어도 하나 이상 함수의 해시코드를 포함하는 해시코드테이블을 저장하는 과정;
상기 해시코드테이블에 대한 해시코드를 암호화하여 시그너쳐(signature)를 생성하는 과정; 및
상기 시그너쳐를 저장하는 과정
을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법. - 제 1 항에 있어서,
상기 특정함수는 비밀번호 입력, 결제 관련, 계정인증, 암호화·복호화, 인증서 검증, 상품 구매·판매, 연산 결과 판정 및 초기화 함수인 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법. - 보안태그가 적용된 함수를 적어도 하나 이상 포함하는 바이너리를 메인메모리에 로드하는 과정;
상기 바이너리가 상기 메인메모리에서 실행되는 과정에서, 상기 보안태그를 포함하는 특정함수가 호출되어, 상기 보안태그가 발견되면, 상기 함수의 코드 블록에 대한 해시코드를 추출하는 메모리해시 추출 과정;
상기 해시코드와 해시레지스트리에 저장되어 있는 적어도 하나 이상 함수의 해시코드 포함하는 해시코드테이블 중 어느 하나와의 일치 여부를 확인하여 상기 특정함수가 변조되었는지 여부를 판단하는 함수 변조 판단 과정; 및
상기 함수 변조 판단 과정의 결과 상기 특정함수가 변조되었다고 판단된 경우, 상기 바이너리의 실행을 중지하는 과정
을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법. - 제 6 항에 있어서,
상기 메모리해시 추출 과정은,
상기 특정함수의 코드 블록 내에서 무결성 검사의 시작지점을 표시하는 시작태그로부터 종료지점을 표시하는 종료태그까지에 대한 해시코드를 추출하는 과정
을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법. - 제 6 항에 있어서,
상기 메모리해시 추출 과정은,
상기 특정함수에 대한 무결성 검사 이후, 다시 상기 특정함수가 호출된 경우, 기 설정된 시간 간격 내에서는 상기 특정함수에 대한 무결성 검사를 생략하도록 하는 과정
을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법. - 제 6 항에 있어서,
상기 메모리해시 추출 과정은,
상기 해시레지스트리의 변조여부를 검증하기 위하여, 상기 해시레지스트리에 저장된 상기 해시코드테이블에 대한 해시코드를 암호화하여 시그너쳐(singature)를 생성하는 과정; 및
상기 시그너쳐와 상기 해시레지스트리 또는 별도의 장소에 보관된 시그너쳐가 일치하지 않을 경우, 상기 바이너리의 실행을 중지하는 과정
을 포함하는 것을 특징으로 하는 해시를 이용한 동적코드의 무결성 검증 방법.
Priority Applications (6)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
KR20130097412A KR101434860B1 (ko) | 2013-08-16 | 2013-08-16 | 해시를 이용한 동적코드의 무결성 검증 방법 |
PCT/KR2014/007444 WO2015023093A1 (ko) | 2013-08-16 | 2014-08-11 | 해시를 이용한 동적코드의 무결성 검증 방법 |
US14/912,323 US20160162686A1 (en) | 2013-08-16 | 2014-08-11 | Method for verifying integrity of dynamic code using hash background of the invention |
JP2016534526A JP2016528635A (ja) | 2013-08-16 | 2014-08-11 | ハッシュを用いた動的コードの無欠性検証方法 |
EP14835981.3A EP3035224A4 (en) | 2013-08-16 | 2014-08-11 | Method for verifying integrity of dynamic code using hash |
CN201480056604.6A CN105637516A (zh) | 2013-08-16 | 2014-08-11 | 使用散列对动态代码的完整性进行验证的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
KR20130097412A KR101434860B1 (ko) | 2013-08-16 | 2013-08-16 | 해시를 이용한 동적코드의 무결성 검증 방법 |
Publications (1)
Publication Number | Publication Date |
---|---|
KR101434860B1 true KR101434860B1 (ko) | 2014-09-02 |
Family
ID=51758835
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR20130097412A KR101434860B1 (ko) | 2013-08-16 | 2013-08-16 | 해시를 이용한 동적코드의 무결성 검증 방법 |
Country Status (6)
Country | Link |
---|---|
US (1) | US20160162686A1 (ko) |
EP (1) | EP3035224A4 (ko) |
JP (1) | JP2016528635A (ko) |
KR (1) | KR101434860B1 (ko) |
CN (1) | CN105637516A (ko) |
WO (1) | WO2015023093A1 (ko) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20200027398A (ko) * | 2019-01-31 | 2020-03-12 | 김종현 | 스마트 거래의 보안 안정성 관리 서버 |
KR20210073255A (ko) * | 2019-12-10 | 2021-06-18 | 재단법인대구경북과학기술원 | 어플리케이션의 무결성 검사방법 |
KR20230091660A (ko) * | 2021-12-16 | 2023-06-23 | 주식회사 텔레칩스 | 소프트웨어의 무결성 검증 방법 및 그 장치 |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016109558A1 (en) * | 2014-12-29 | 2016-07-07 | Rubicon Labs, Inc. | System and method for secure code entry point control |
EP3330859A1 (en) * | 2016-12-05 | 2018-06-06 | Universiteit Gent | Self-debugging |
CN106778272A (zh) * | 2016-12-27 | 2017-05-31 | 成都三零瑞通移动通信有限公司 | 一种对调用函数进行动态安全检测的方法 |
US11755499B2 (en) * | 2018-05-31 | 2023-09-12 | Secturion Systems, Inc. | Locally-stored remote block data integrity |
US11159327B2 (en) * | 2018-08-06 | 2021-10-26 | Tyson York Winarski | Blockchain augmentation of a material exchange format MXF file |
US11288360B2 (en) | 2020-03-04 | 2022-03-29 | Kyndryl, Inc. | Preventing untrusted script execution |
CN113239330A (zh) * | 2021-06-10 | 2021-08-10 | 杭州安恒信息技术股份有限公司 | 一种基于散列算法的反调试方法及相关装置 |
US20240095375A1 (en) * | 2022-09-21 | 2024-03-21 | Qualcomm Incorporated | Mechanism To Secure An Execution Environment In Processor Cores |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008176542A (ja) | 2007-01-18 | 2008-07-31 | Fuji Xerox Co Ltd | 送信装置、送信方法及び送信プログラム |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20030075018A (ko) * | 2002-03-15 | 2003-09-22 | 주식회사 셈틀로미디어 | 변조 방지용 소프트웨어 파일 생성 장치와 그 소프트웨어파일의 자가 무결성 검증 방법 및 클라이언트-서버환경에서의 소프트웨어 파일의 자가 무결성 검증 방법 |
US20040083373A1 (en) * | 2002-10-28 | 2004-04-29 | Perkins Gregory M. | Automatically generated cryptographic functions for renewable tamper resistant security systems |
US7103779B2 (en) * | 2003-09-18 | 2006-09-05 | Apple Computer, Inc. | Method and apparatus for incremental code signing |
JP4517636B2 (ja) * | 2003-12-05 | 2010-08-04 | 富士ゼロックス株式会社 | 実行プログラム作成方法、関数プログラム、及び関数プログラム実行方法 |
ATE429747T1 (de) * | 2004-06-30 | 2009-05-15 | France Telecom | Elektronisches wahlverfahren und -system in einem hochsicherheitskommunikationsnetz |
KR101028163B1 (ko) * | 2009-12-14 | 2011-04-08 | 타임스탬프솔루션 주식회사 | 원본증명마크 및 임베디드 기술을 이용한 전자문서의 타임스탬프 발급 및 검증방법 |
EP2378452B1 (en) * | 2010-04-16 | 2012-12-19 | Thomson Licensing | Method, device and computer program support for verification of checksums for self-modified computer code |
US9477834B2 (en) * | 2012-02-08 | 2016-10-25 | Arm Limited | Maintaining secure data isolated from non-secure access when switching between domains |
-
2013
- 2013-08-16 KR KR20130097412A patent/KR101434860B1/ko active IP Right Grant
-
2014
- 2014-08-11 US US14/912,323 patent/US20160162686A1/en not_active Abandoned
- 2014-08-11 JP JP2016534526A patent/JP2016528635A/ja active Pending
- 2014-08-11 CN CN201480056604.6A patent/CN105637516A/zh active Pending
- 2014-08-11 EP EP14835981.3A patent/EP3035224A4/en not_active Withdrawn
- 2014-08-11 WO PCT/KR2014/007444 patent/WO2015023093A1/ko active Application Filing
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008176542A (ja) | 2007-01-18 | 2008-07-31 | Fuji Xerox Co Ltd | 送信装置、送信方法及び送信プログラム |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20200027398A (ko) * | 2019-01-31 | 2020-03-12 | 김종현 | 스마트 거래의 보안 안정성 관리 서버 |
KR102143511B1 (ko) | 2019-01-31 | 2020-08-11 | 김종현 | 스마트 거래의 보안 안정성 관리 서버 |
KR20210073255A (ko) * | 2019-12-10 | 2021-06-18 | 재단법인대구경북과학기술원 | 어플리케이션의 무결성 검사방법 |
KR102310766B1 (ko) * | 2019-12-10 | 2021-10-12 | 재단법인대구경북과학기술원 | 어플리케이션의 무결성 검사방법 |
KR20230091660A (ko) * | 2021-12-16 | 2023-06-23 | 주식회사 텔레칩스 | 소프트웨어의 무결성 검증 방법 및 그 장치 |
KR102598510B1 (ko) * | 2021-12-16 | 2023-11-06 | 주식회사 텔레칩스 | 소프트웨어의 무결성 검증 방법 및 그 장치 |
Also Published As
Publication number | Publication date |
---|---|
CN105637516A (zh) | 2016-06-01 |
WO2015023093A1 (ko) | 2015-02-19 |
EP3035224A4 (en) | 2017-03-29 |
EP3035224A1 (en) | 2016-06-22 |
JP2016528635A (ja) | 2016-09-15 |
US20160162686A1 (en) | 2016-06-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101434860B1 (ko) | 해시를 이용한 동적코드의 무결성 검증 방법 | |
KR101471589B1 (ko) | 공통중간언어 기반 프로그램을 위한 보안 제공 방법 | |
CN105453103B (zh) | 按照参考平台清单和数据封装的安全操作***启动 | |
KR102324336B1 (ko) | 사용자 장치 및 그것에 대한 무결성 검증 방법 | |
US20160275019A1 (en) | Method and apparatus for protecting dynamic libraries | |
KR101695639B1 (ko) | 클라우드 기반의 애플리케이션 보안 서비스 제공 방법 및 시스템 | |
CN112231702B (zh) | 应用保护方法、装置、设备及介质 | |
CN103488937A (zh) | 一种度量方法、电子设备及度量*** | |
KR101235517B1 (ko) | 메모리에서 실행되는 컴퓨터 프로그램의 변조 탐지 방법 | |
CN111967065A (zh) | 一种数据保护方法、处理器及电子设备 | |
US20160092313A1 (en) | Application Copy Counting Using Snapshot Backups For Licensing | |
KR101557455B1 (ko) | 응용 프로그램 코드 분석 장치 및 그것을 이용한 코드 분석 방법 | |
CN102855421A (zh) | 防止bios程序被盗用的方法、基本输入输出***及计算装置 | |
KR101624387B1 (ko) | 소프트웨어 버스마크에 기반한 소프트웨어 자산 관리 방법 및 그 장치 | |
CN103530169B (zh) | 虚拟机文件保护方法和用户终端 | |
CN110597496B (zh) | 应用程序的字节码文件获取方法及装置 | |
CN114816549B (zh) | 一种保护bootloader及其环境变量的方法及*** | |
CN108073411A (zh) | 一种补丁的内核加载方法及装置 | |
US9323951B2 (en) | Encrypted warranty verification and diagnostic tool | |
CN113268737A (zh) | 环境安全验证方法、***和客户端 | |
KR101556908B1 (ko) | 프로그램 보호 장치 | |
Gu et al. | A secure bootstrap based on trusted computing | |
Choi et al. | Android application's copyright protection technology based on forensic mark | |
TWM651072U (zh) | 在安卓系統對金融應用程式進行偽冒檢測之系統 | |
Jiajia et al. | A Java Code Protection Scheme via Dynamic Recovering Runtime Instructions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
E701 | Decision to grant or registration of patent right | ||
GRNT | Written decision to grant | ||
FPAY | Annual fee payment |
Payment date: 20170911 Year of fee payment: 4 |
|
FPAY | Annual fee payment |
Payment date: 20180808 Year of fee payment: 5 |
|
FPAY | Annual fee payment |
Payment date: 20190906 Year of fee payment: 6 |