KR102494838B1 - Methods and apparatus for disarming a link on documentsummaryinformation stream in ms-cfb - Google Patents

Methods and apparatus for disarming a link on documentsummaryinformation stream in ms-cfb Download PDF

Info

Publication number
KR102494838B1
KR102494838B1 KR1020220135068A KR20220135068A KR102494838B1 KR 102494838 B1 KR102494838 B1 KR 102494838B1 KR 1020220135068 A KR1020220135068 A KR 1020220135068A KR 20220135068 A KR20220135068 A KR 20220135068A KR 102494838 B1 KR102494838 B1 KR 102494838B1
Authority
KR
South Korea
Prior art keywords
record
value
field
property
vthyperlinks
Prior art date
Application number
KR1020220135068A
Other languages
Korean (ko)
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 시큐레터 주식회사
Priority to KR1020220135068A priority Critical patent/KR102494838B1/en
Application granted granted Critical
Publication of KR102494838B1 publication Critical patent/KR102494838B1/en

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/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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/955Retrieval from the web using information identifiers, e.g. uniform resource locators [URL]
    • G06F16/9566URL specific, e.g. using aliases, detecting broken or misspelled links
    • 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/554Detecting local intrusion or implementing counter-measures involving event detection and direct action

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Databases & Information Systems (AREA)
  • Virology (AREA)
  • General Health & Medical Sciences (AREA)
  • Health & Medical Sciences (AREA)
  • Data Mining & Analysis (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

A method of a server to disarm link information of a DocumentSummaryInformation stream checks a PropertySetStream record in the DocumentSummaryInformation stream; checks a field value of NumPropertySets in the PropertySetStream record; determines whether the field values of FMTID0 and FMTID1 are appropriate based on the field value of NumPropertySets indicating 2; checks a VtHyperlinks record based on whether the field values of FMTID0 and FMTID1 are appropriate; and disarms the link information based on the VtHyperlinks record.

Description

MS-CFB의 DocumentSummaryInformation 스트림에서 Link의 무해화를 위한 방법 및 장치 {METHODS AND APPARATUS FOR DISARMING A LINK ON DOCUMENTSUMMARYINFORMATION STREAM IN MS-CFB}Method and apparatus for disarming Link in DocumentSummaryInformation stream of MS-CFB {METHODS AND APPARATUS FOR DISARMING A LINK ON DOCUMENTSUMMARYINFORMATION STREAM IN MS-CFB}

본 명세서는 MS-CFB의 DocumentSummaryInformation 스트림에서 Link의 무해화를 위한 방법 및 장치에 관한 것이다.The present specification relates to a method and apparatus for disarming a Link in a DocumentSummaryInformation stream of MS-CFB.

지능형 지속 위협(Advanced Persistent Threat, APT) 공격은 공격자가 특정 타깃을 정하고 목표한 정보를 빼내기 위해 고도의 공격기법을 적용하여 지속적으로 다양한 형태의 악성 코드를 활용한다. 특히 APT 공격은 초기 침입단계에서 탐지하지 못하는 경우가 많으며, 실행(Portable Executable, PE) 파일보다는 악성 코드를 포함하는 비실행(Non-Portable Executable, Non-PE) 파일을 이용하는 경우가 많다. In the Advanced Persistent Threat (APT) attack, an attacker sets a specific target and applies advanced attack techniques to continuously utilize various types of malicious codes to steal target information. In particular, APT attacks are often undetectable at the initial intrusion stage and often use Non-Portable Executable (Non-PE) files containing malicious codes rather than Portable Executable (PE) files.

비실행 파일은 실행 파일과 반대되는 개념으로써, 자체적으로 실행되지 않는 파일을 의미한다. 비실행 파일로는 워드 파일, 엑셀 파일, 한글 파일, PDF 파일 등의 문서 파일, 이미지 파일, 동영상 파일, 자바스크립트 파일, 및 HTML 파일을 예로 들 수 있다. APT 공격에 악성 코드가 포함된 비실행 파일이 많이 이용되는 이유는 비실행 파일을 실행하는 응용 프로그램이 기본적으로 어느 정도의 보안 취약성을 가지고 있기 때문이다. 뿐만 아니라, 악성 코드를 비실행 파일에 포함시키면 파일을 변경하여 변종 악성 코드를 손쉽게 만들 수 있기 때문이다. A non-executable file is a concept opposite to an executable file, and means a file that is not executed by itself. Examples of non-executable files include document files such as word files, Excel files, Hangul files, and PDF files, image files, video files, JavaScript files, and HTML files. The reason why non-executable files containing malicious codes are frequently used in APT attacks is that applications that execute non-executable files basically have some level of security vulnerability. In addition, if the malicious code is included in the non-executable file, the modified malicious code can be easily created by changing the file.

문서 행위란 비실행 파일이 관련된 응용 프로그램의 액션을 실행하는 행위이다. 기존의 APT 솔루션들은 문서 행위 기반으로 동작하기 때문에 문서 행위 발생 후, 샌드박스(Virtural Machine, VM)의 변화를 관찰하여 악성 여부를 판단한다. 이는 문서 행위의 발현을 전부 기다린 후 악성 여부를 파악하기 때문에 분석시간이 오래 걸린다. A document action is an action in which a non-executable file executes an associated application action. Existing APT solutions operate based on document behavior, so after the document behavior occurs, changes in the sandbox (Virtual Machine, VM) are observed to determine whether it is malicious. This takes a long time to analyze because it waits for all document behaviors to appear and then determines whether or not it is malignant.

또한, CDR과 같은 기존 APT 솔루션들은 악성 액티브 콘텐츠를 제거할 수는 있지만, 문서의 필수 요소(예를 들어, 본문, 폰트)에서 발생하는 취약점을 제거할 수는 없기 때문에 보안 공백이 발생한다. In addition, existing APT solutions such as CDR can remove malicious active content, but security gaps occur because they cannot remove vulnerabilities that occur in essential elements (eg body text, fonts) of documents.

비실행 파일에는 유해한 링크 정보가 포함될 가능성이 있기 때문에, 링크 정보를 무해화하여야 한다. 이 경우에는 비실행 파일의 레이아웃이 바뀌거나 틀어지는 문제가 발생하지 않아야 한다.Since there is a possibility that harmful link information may be included in non-executable files, link information must be harmless. In this case, there should be no problem that the layout of non-executable files is changed or distorted.

본 명세서의 목적은, MS-CFB의 DocumentSummaryInformation 스트림에서 Link를 무해화 하기 위한 방법을 제안한다.The purpose of this specification is to propose a method for harmless Link in the DocumentSummaryInformation stream of MS-CFB.

본 명세서가 이루고자 하는 기술적 과제들은 이상에서 언급한 기술적 과제들로 제한되지 않으며, 언급되지 않은 또 다른 기술적 과제들은 이하의 명세서의 상세한 설명으로부터 본 명세서가 속하는 기술분야에서 통상의 지식을 가진 자에게 명확하게 이해될 수 있을 것이다.The technical problems to be achieved by this specification are not limited to the above-mentioned technical problems, and other technical problems not mentioned are clear to those skilled in the art from the detailed description of the specification below. will be understandable.

본 명세서의 일 양상은, 서버가 DocumentSummaryInformation 스트림의 링크정보를 무해화(Disarming) 시키는 방법에 있어서, 상기 DocumentSummaryInformation 스트림에서 PropertySetStream 레코드를 확인하는 단계; 상기 PropertySetStream 레코드의 NumPropertySets의 필드값을 확인하는 단계; 상기 NumPropertySets의 필드값이 2를 나타내는 것에 근거하여, FMTID0 및 FMTID1의 필드값이 정당한지 판단하는 단계; 상기 FMTID0 및 상기 FMTID1의 필드값이 정당한 것에 근거하여, VtHyperlinks 레코드를 확인하는 단계; 및 상기 VtHyperlinks 레코드에 근거하여, 상기 링크정보를 무해화하는 단계; 를 포함할 수 있다.One aspect of the present specification is a method for disarming link information of a DocumentSummaryInformation stream by a server, comprising: checking a PropertySetStream record in the DocumentSummaryInformation stream; checking field values of NumPropertySets of the PropertySetStream record; determining whether the field values of FMTID0 and FMTID1 are valid based on the fact that the field value of the NumPropertySets indicates 2; verifying a VtHyperlinks record based on valid field values of the FMTID0 and the FMTID1; and harmless the link information based on the VtHyperlinks record. can include

또한, 상기 FMTID0 및 상기 FMTID1의 필드값이 정당한지 판단하는 단계는 상기 FMTID0 필드값은 D5CDD502-2E9C-101B-9397-08002B2CF9AE 값이고, 상기 FMTID1 필드값은 D5CDD505-2E9C-101B-9397-08002B2CF9AE 값인 것에 근거할 수 있다.In addition, the step of determining whether the field values of the FMTID0 and the FMTID1 are valid is because the FMTID0 field value is a D5CDD502-2E9C-101B-9397-08002B2CF9AE value and the FMTID1 field value is a D5CDD505-2E9C-101B-9397-08002B2CF9AE value. can be based

또한, 상기 VtHyperlinks 레코드를 확인하는 단계는 CodePage Property에서 Dictionary Property와 관련된 인코딩 정보를 확인하는 단계; 및 상기 인코딩 정보에 근거하여, 상기 Dictionary Property에서 문자열 “_PID_HLINKS”를 확인하는 단계; 를 포함할 수 있다.In addition, the checking of the VtHyperlinks record may include checking encoding information related to a Dictionary Property in CodePage Property; and checking a character string “_PID_HLINKS” in the Dictionary Property based on the encoding information; can include

또한, 상기 “_PID_HLINKS”의 확인에 근거하여, 상기 VtHyperlinks 레코드는 TypedPropertyValue에 포함될 수 있다.Also, based on the confirmation of “_PID_HLINKS”, the VtHyperlinks record may be included in TypedPropertyValue.

또한, 상기 링크정보를 무해화하는 단계는 상기 VtHyperlinks 레코드의 vtValue 필드를 통해, VtHyperlinkValue 레코드를 확인하는 단계; 상기 VtHyperlinkValue 레코드의 vecHyperlink의 rgHyperlink 필드를 통해, VtHyperlink의 배열을 확인하는 단계; 및 상기 VtHyperlink 레코드의 hlink1 및 hlink2 필드에 대해 무해화하는 단계;를 포함할 수 있다.In addition, the step of harmless link information may include checking a VtHyperlinkValue record through a vtValue field of the VtHyperlinks record; checking an array of VtHyperlinks through an rgHyperlink field of vecHyperlink of the VtHyperlinkValue record; and detoxifying the hlink1 and hlink2 fields of the VtHyperlink record.

또한, 상기 hlink1 및 hlink2 필드에 대해 무해화하는 단계는 상기 hlink1 및 hlink2 필드에서 scheme만 남기는 단계; 를 포함할 수 있다.In addition, the step of disarming the hlink1 and hlink2 fields may include leaving only schemes in the hlink1 and hlink2 fields; can include

또한, 무해화된 상기 링크정보에 근거하여, dwHash 필드를 수정하는 단계; 를 포함할 수 있다.Also, based on the harmless link information, modifying the dwHash field; can include

본 명세서의 또 다른 일 양상은, DocumentSummaryInformation 스트림의 링크정보를 무해화(Disarming) 시키는 서버에 있어서, 통신부; 메모리; 및 상기 통신부 및 상기 메모리를 기능적으로 제어하는 프로세서;를 포함하고, 상기 프로세서는 상기 DocumentSummaryInformation 스트림에서 PropertySetStream 레코드를 확인하고, 상기 PropertySetStream 레코드의 NumPropertySets의 필드값을 확인하며, 상기 NumPropertySets의 필드값이 2를 나타내는 것에 근거하여, FMTID0 및 FMTID1의 필드값이 정당한지 판단하고, 상기 FMTID0 및 상기 FMTID1의 필드값이 정당한 것에 근거하여, VtHyperlinks 레코드를 확인하고, 상기 VtHyperlinks 레코드에 근거하여, 상기 링크정보를 무해화 할 수 있다.Another aspect of the present specification is a server for disarming link information of a DocumentSummaryInformation stream, comprising: a communication unit; Memory; and a processor functionally controlling the communication unit and the memory, wherein the processor checks a PropertySetStream record in the DocumentSummaryInformation stream, checks a field value of NumPropertySets of the PropertySetStream record, and determines that a field value of the NumPropertySets is 2. Based on the indication, it is determined whether the field values of FMTID0 and FMTID1 are valid, and based on whether the field values of FMTID0 and FMTID1 are valid, the VtHyperlinks record is identified, and the link information is harmless based on the VtHyperlinks record. can do.

본 명세서의 실시예에 따르면, MS-CFB의 DocumentSummaryInformation 스트림에서 Link를 무해화를 수행할 수 있다.According to an embodiment of the present specification, Link can be harmless in the DocumentSummaryInformation stream of MS-CFB.

본 명세서에서 얻을 수 있는 효과는 이상에서 언급한 효과로 제한되지 않으며, 언급하지 않은 또 다른 효과들은 아래의 기재로부터 본 명세서가 속하는 기술분야에서 통상의 지식을 가진 자에게 명확하게 이해될 수 있을 것이다.Effects obtainable in the present specification are not limited to the effects mentioned above, and other effects not mentioned will be clearly understood by those skilled in the art from the description below. .

도 1은 본 명세서와 관련된 서버 또는 클라이언트를 나타내는 도면이다.
도 2는 본 명세서에 적용될 수 있는 비정상 입력의 예시이다.
도 3은 본 명세서가 적용될 수 있는 URI 구성을 예시한다.
도 4는 본 명세서가 적용될 수 있는 DocumentSummaryInformation 스트림의 무해화 방법을 예시한다.
도 5는 본 명세서가 적용될 수 있는 PropertySet의 예시이다.
도 6은 본 명세서가 적용될 수 있는 PropertySetStream의 예시이다.
도 7은 본 명세서가 적용될 수 있는 DocumentSummaryInformation 스트림의 예시이다.
도 8은 본 명세서가 적용될 수 있는 VtHyperlinks의 예시이다.
도 9는 본 명세서가 적용될 수 있는 VtHyperlink의 예시이다.
본 명세서에 관한 이해를 돕기 위해 상세한 설명의 일부로 포함되는, 첨부 도면은 본 명세서에 대한 실시예를 제공하고, 상세한 설명과 함께 본 명세서의 기술적 특징을 설명한다.
1 is a diagram showing a server or client related to the present specification.
2 is an example of an abnormal input that can be applied to this specification.
3 illustrates a URI configuration to which this specification can be applied.
4 illustrates a method of harmless a DocumentSummaryInformation stream to which this specification can be applied.
5 is an example of a PropertySet to which this specification can be applied.
6 is an example of PropertySetStream to which this specification can be applied.
7 is an example of a DocumentSummaryInformation stream to which this specification can be applied.
8 is an example of VtHyperlinks to which the present specification can be applied.
9 is an example of VtHyperlink to which the present specification can be applied.
The accompanying drawings, which are included as part of the detailed description to aid understanding of the present specification, provide examples of the present specification and describe technical features of the present specification together with the detailed description.

이하, 첨부된 도면을 참조하여 본 명세서에 개시된 실시예를 상세히 설명하되, 도면 부호에 관계없이 동일하거나 유사한 구성요소는 동일한 참조 번호를 부여하고 이에 대한 중복되는 설명은 생략하기로 한다. 이하의 설명에서 사용되는 구성요소에 대한 접미사 "모듈" 및 "부"는 명세서 작성의 용이함만이 고려되어 부여되거나 혼용되는 것으로서, 그 자체로 서로 구별되는 의미 또는 역할을 갖는 것은 아니다. 또한, 본 명세서에 개시된 실시예를 설명함에 있어서 관련된 공지 기술에 대한 구체적인 설명이 본 명세서에 개시된 실시예의 요지를 흐릴 수 있다고 판단되는 경우 그 상세한 설명을 생략한다. 또한, 첨부된 도면은 본 명세서에 개시된 실시예를 쉽게 이해할 수 있도록 하기 위한 것일 뿐, 첨부된 도면에 의해 본 명세서에 개시된 기술적 사상이 제한되지 않으며, 본 명세서의 사상 및 기술 범위에 포함되는 모든 변경, 균등물 내지 대체물을 포함하는 것으로 이해되어야 한다. Hereinafter, the embodiments disclosed in this specification will be described in detail with reference to the accompanying drawings, but the same or similar components are given the same reference numerals regardless of reference numerals, and redundant description thereof will be omitted. The suffixes "module" and "unit" for components used in the following description are given or used together in consideration of ease of writing the specification, and do not have meanings or roles that are distinct from each other by themselves. In addition, in describing the embodiments disclosed in this specification, if it is determined that a detailed description of a related known technology may obscure the gist of the embodiment disclosed in this specification, the detailed description thereof will be omitted. In addition, the accompanying drawings are only for easy understanding of the embodiments disclosed in this specification, the technical idea disclosed in this specification is not limited by the accompanying drawings, and all changes included in the spirit and technical scope of this specification , it should be understood to include equivalents or substitutes.

제1, 제2 등과 같이 서수를 포함하는 용어는 다양한 구성요소들을 설명하는데 사용될 수 있지만, 상기 구성요소들은 상기 용어들에 의해 한정되지는 않는다. 상기 용어들은 하나의 구성요소를 다른 구성요소로부터 구별하는 목적으로만 사용된다.Terms including ordinal numbers, such as first and second, may be used to describe various components, but the components are not limited by the terms. These terms are only used for the purpose of distinguishing one component from another.

어떤 구성요소가 다른 구성요소에 "연결되어" 있다거나 "접속되어" 있다고 언급된 때에는, 그 다른 구성요소에 직접적으로 연결되어 있거나 또는 접속되어 있을 수도 있지만, 중간에 다른 구성요소가 존재할 수도 있다고 이해되어야 할 것이다. 반면에, 어떤 구성요소가 다른 구성요소에 "직접 연결되어" 있다거나 "직접 접속되어" 있다고 언급된 때에는, 중간에 다른 구성요소가 존재하지 않는 것으로 이해되어야 할 것이다.It is understood that when an element is referred to as being "connected" or "connected" to another element, it may be directly connected or connected to the other element, but other elements may exist in the middle. It should be. On the other hand, when an element is referred to as “directly connected” or “directly connected” to another element, it should be understood that no other element exists in the middle.

단수의 표현은 문맥상 명백하게 다르게 뜻하지 않는 한, 복수의 표현을 포함한다.Singular expressions include plural expressions unless the context clearly dictates otherwise.

본 명세서에서, "포함한다" 또는 "가지다" 등의 용어는 명세서상에 기재된 특징, 숫자, 단계, 동작, 구성요소, 부품 또는 이들을 조합한 것이 존재함을 지정하려는 것이지, 하나 또는 그 이상의 다른 특징들이나 숫자, 단계, 동작, 구성요소, 부품 또는 이들을 조합한 것들의 존재 또는 부가 가능성을 미리 배제하지 않는 것으로 이해되어야 한다.In this specification, terms such as "comprise" or "having" are intended to indicate that there is a feature, number, step, operation, component, part, or combination thereof described in the specification, but one or more other features It should be understood that the presence or addition of numbers, steps, operations, components, parts, or combinations thereof is not precluded.

또한, 명세서에서 사용되는 "부"라는 용어는 소프트웨어 또는 하드웨어 구성요소를 의미하며, "부"는 어떤 역할들을 수행한다. 그렇지만 "부"는 소프트웨어 또는 하드웨어에 한정되는 의미는 아니다. "부"는 어드레싱할 수 있는 저장 매체에 있도록 구성될 수도 있고 하나 또는 그 이상의 프로세서들을 재생시키도록 구성될 수도 있다. 따라서, 일 예로서 "부"는 소프트웨어 구성요소들, 객체지향 소프트웨어 구성요소들, 클래스 구성요소들 및 태스크 구성요소들과 같은 구성요소들과, 프로세스들, 함수들, 속성들, 프로시저들, 서브루틴들, 프로그램 코드의 세그먼트들, 드라이버들, 펌웨어, 마이크로 코드, 회로, 데이터, 데이터베이스, 데이터 구조들, 테이블들, 어레이들 및 변수들을 포함한다. 구성요소들과 "부"들 안에서 제공되는 기능은 더 작은 수의 구성요소들 및 "부"들로 결합되거나 추가적인 구성요소들과 "부"들로 더 분리될 수 있다.Also, the term “unit” used in the specification means a software or hardware component, and “unit” performs certain roles. However, "unit" is not meant to be limited to software or hardware. A “unit” may be configured to reside in an addressable storage medium and may be configured to reproduce on one or more processors. Thus, as an example, “unit” can refer to components such as software components, object-oriented software components, class components and task components, processes, functions, properties, procedures, subroutines, segments of program code, drivers, firmware, microcode, circuitry, data, databases, data structures, tables, arrays and variables. Functionality provided within components and "parts" may be combined into fewer components and "parts" or further separated into additional components and "parts".

또한, 본 명세서의 일 실시예에 따르면 "부"는 프로세서 및 메모리로 구현될 수 있다. 용어 "프로세서"는 범용 프로세서, 중앙 처리 장치 (CPU), 마이크로프로세서, 디지털 신호 프로세서 (DSP), 제어기, 마이크로제어기, 상태 머신 등을 포함하도록 넓게 해석되어야 한다. 몇몇 환경에서는, "프로세서"는 주문형 반도체 (ASIC), 프로그램가능 로직 디바이스 (PLD), 필드 프로그램가능 게이트 어레이 (FPGA) 등을 지칭할 수도 있다. 용어 "프로세서"는, 예를 들어, DSP 와 마이크로프로세서의 조합, 복수의 마이크로프로세서들의 조합, DSP 코어와 결합한 하나 이상의 마이크로프로세서들의 조합, 또는 임의의 다른 그러한 구성들의 조합과 같은 처리 디바이스들의 조합을 지칭할 수도 있다.Also, according to one embodiment of the present specification, "unit" may be implemented as a processor and a memory. The term “processor” should be interpreted broadly to include general-purpose processors, central processing units (CPUs), microprocessors, digital signal processors (DSPs), controllers, microcontrollers, state machines, and the like. In some circumstances, “processor” may refer to an application specific integrated circuit (ASIC), programmable logic device (PLD), field programmable gate array (FPGA), or the like. The term "processor" refers to a combination of processing devices, such as, for example, a combination of a DSP and a microprocessor, a combination of a plurality of microprocessors, a combination of one or more microprocessors in conjunction with a DSP core, or any other such configuration. may also refer to

용어 "메모리"는 전자 정보를 저장 가능한 임의의 전자 컴포넌트를 포함하도록 넓게 해석되어야 한다. 용어 메모리는 임의 액세스 메모리 (RAM), 판독-전용 메모리 (ROM), 비-휘발성 임의 액세스 메모리 (NVRAM), 프로그램가능 판독-전용 메모리 (PROM), 소거-프로그램가능 판독 전용 메모리 (EPROM), 전기적으로 소거가능 PROM (EEPROM), 플래쉬 메모리, 자기 또는 광학 데이터 저장장치, 레지스터들 등과 같은 프로세서-판독가능 매체의 다양한 유형들을 지칭할 수도 있다. 프로세서가 메모리로부터 정보를 판독하고/하거나 메모리에 정보를 기록할 수 있다면 메모리는 프로세서와 전자 통신 상태에 있다고 불린다. 프로세서에 집적된 메모리는 프로세서와 전자 통신 상태에 있다.The term “memory” should be interpreted broadly to include any electronic component capable of storing electronic information. The term memory includes random access memory (RAM), read-only memory (ROM), non-volatile random access memory (NVRAM), programmable read-only memory (PROM), erasable-programmable read-only memory (EPROM), electrical may refer to various types of processor-readable media, such as erasable PROM (EEPROM), flash memory, magnetic or optical data storage, registers, and the like. A memory is said to be in electronic communication with the processor if the processor can read information from and/or write information to the memory. Memory integrated with the processor is in electronic communication with the processor.

본 명세서에서 사용되는 "비실행 파일"이란 실행 파일 또는 실행 가능한 파일과 반대되는 개념으로서 자체적으로 실행되지 않는 파일을 의미한다. 예를 들어, 비실행 파일은 PDF 파일, 한글 파일, 워드 파일과 같은 문서 파일, JPG 파일과 같은 이미지 파일, 동영상 파일, 자바 스크립트 파일, HTML 파일 등이 될 수 있으나, 이에 한정되지 않는다.As used herein, a "non-executable file" is a concept opposite to an executable file or an executable file, and means a file that is not itself executed. For example, the non-executable file may be a PDF file, a Korean file, a document file such as a word file, an image file such as a JPG file, a video file, a JavaScript file, and an HTML file, but is not limited thereto.

아래에서는 첨부한 도면을 참고하여 실시예에 대하여 본 명세서가 속하는 기술 분야에서 통상의 지식을 가진 자가 용이하게 실시할 수 있도록 상세히 설명한다. 그리고 도면에서 본 개시를 명확하게 설명하기 위해서 설명과 관계없는 부분들은 생략될 수 있다.Hereinafter, with reference to the accompanying drawings, embodiments will be described in detail so that those skilled in the art can easily carry out the embodiments. In addition, in order to clearly describe the present disclosure in the drawings, parts irrelevant to the description may be omitted.

도 1은 본 명세서와 관련된 서버 또는 클라이언트를 나타내는 도면이다.1 is a diagram showing a server or client related to the present specification.

본 명세서에서 서버(또는 클라우드 서버) 또는 클라이언트는 제어부(100) 및 통신부(130)를 포함할 수 있다. 제어부(100)는 프로세서(110) 및 메모리(120)를 포함할 수 있다. 프로세서(110)는 메모리(120)에 저장된 명령어들을 수행할 수 있다. 프로세서(110)는 통신부(130)를 제어할 수 있다.In this specification, a server (or cloud server) or a client may include a control unit 100 and a communication unit 130. The controller 100 may include a processor 110 and a memory 120 . The processor 110 may execute instructions stored in the memory 120 . The processor 110 may control the communication unit 130 .

프로세서(110)는 메모리(120)에 저장된 명령어에 기초하여 서버 또는 클라이언트의 동작을 제어할 수 있다. 서버 또는 클라이언트는 하나의 프로세서를 포함할 수 있고, 복수의 프로세서를 포함할 수 있다. 서버 또는 클라이언트가 복수의 프로세서를 포함하는 경우, 복수의 프로세서 중 적어도 일부는 물리적으로 이격된 거리에 위치할 수 있다. 또한, 서버 또는 클라이언트는 이에 한정되지 않고 알려진 다양한 방식으로 구현될 수 있다.The processor 110 may control the operation of the server or client based on instructions stored in the memory 120 . A server or client may include one processor or may include a plurality of processors. When the server or the client includes a plurality of processors, at least some of the plurality of processors may be located at physically separated distances. In addition, the server or client may be implemented in various known ways without being limited thereto.

통신부(130)는, 서버 또는 클라이언트와 무선 통신 시스템 사이, 서버 또는 클라이언트와 다른 서버 또는 클라이언트 사이, 또는 서버 또는 클라이언트와 외부서버 사이의 무선 통신을 가능하게 하는 하나 이상의 모듈을 포함할 수 있다. 또한, 통신부(110)는, 서버 또는 클라이언트를 하나 이상의 네트워크에 연결하는 하나 이상의 모듈을 포함할 수 있다.The communication unit 130 may include one or more modules enabling wireless communication between a server or client and a wireless communication system, between a server or client and another server or client, or between a server or client and an external server. Also, the communication unit 110 may include one or more modules that connect a server or a client to one or more networks.

제어부(100)는 메모리(120)에 저장된 응용 프로그램을 구동하기 위하여, 서버 또는 클라이언트의 구성요소들 중 적어도 일부를 제어할 수 있다. 나아가, 제어부(100)는 상기 응용 프로그램의 구동을 위하여, 서버 또는 클라이언트에 포함된 구성요소들 중 적어도 둘 이상을 서로 조합하여 동작 시킬 수 있다.The controller 100 may control at least some of the components of the server or client in order to drive an application program stored in the memory 120 . Furthermore, the control unit 100 may combine and operate at least two or more of the components included in the server or client to drive the application program.

본 명세서에서 서버는 리버싱 엔진 또는/및 CDR 서비스를 제공하는 CDR 엔진을 포함할 수 있다.In this specification, the server may include a reversing engine or/and a CDR engine providing CDR services.

리버싱(Reversing) 엔진Reversing Engine

리버싱 엔진이란, 악성 비실행 파일에 대한 리버스 엔지니어링(리버싱) 과정을 자동화 한 분석/진단 엔진이다. The reversing engine is an analysis/diagnostic engine that automates the reverse engineering (reversing) process for malicious non-executable files.

예를 들어, 리버싱 엔진은 다음의 단계를 수행할 수 있다.For example, the reversing engine may perform the following steps.

1. 파일 분석: 비실행 파일 자체의 외관(예를 들어, 속성, 작성자, 작성 날짜, 파일 타입)을 분석하는 단계로서, 일반 백신 프로그램과 유사하게 비실행 파일 자체의 정보만으로 악성여부를 진단할 수 있다.1. File analysis: As a step of analyzing the appearance of the non-executable file itself (eg, attribute, author, date of creation, file type), similar to general vaccine programs, maliciousness can be diagnosed only with the information of the non-executable file itself. can

2. 정적 분석: 비실행 파일 내의 데이터를 추출, 분석해서 정상, 악성 여부를 판별하는 단계로서, 비실행 파일은 실행하지 않고 파일 구조에 맞게 내부 데이터를 추출하여 비교 분석하여 악성여부를 진단할 수 있다. 이는 매크로, URL 추출 분석 등에 적합할 수 있다.2. Static analysis: This step is to extract and analyze the data in the non-executable file to determine whether it is normal or malicious. The non-executable file is not executed, and internal data is extracted according to the file structure and compared and analyzed to diagnose maliciousness. there is. This may be suitable for macros, URL extraction analysis, and the like.

3. 동적 분석: 비실행 파일을 편집기, 리더기가 포함된 응용프로그램을 통해 읽어들이고 모니터링하면서 행위를 분석하여 악성 여부를 판별하는 단계로서, 매크로, 하이퍼링크, DDE 등 정상기능을 이용한 악성 행위를 탐지하기에 용이하다.3. Dynamic analysis: This step is to determine whether or not the non-executable file is malicious by reading and monitoring the non-executable file through an application program including an editor and reader, and analyzing the behavior while monitoring it. Detecting malicious behavior using normal functions such as macros, hyperlinks, and DDE easy to do

4. 디버깅 분석: 비실행 파일을 읽어들이고 디버깅하여 취약점, 익스플로잇 등을 분석하는 단계로서, 매크로, 하이퍼링크, DDE를 포함하여 문서 내 본문, 표, 폰트, 그림 등을 이용한 응용프로그램의 취약점을 탐지하기에 적합하다.4. Debugging analysis: This step analyzes vulnerabilities and exploits by reading and debugging non-executable files. Detects vulnerabilities of applications using text, tables, fonts, pictures, etc. in documents, including macros, hyperlinks, and DDE. suitable for doing

리버싱 엔진은 디버깅 분석에 사용될 수 있는 디버깅 엔진을 포함할 수 있다. 디버깅 엔진은 비실행 파일의 열람 과정을 디버깅하여 문서 입력, 처리, 출력단계에서 발생하는 취약점을 진단할 수 있다. 여기서 취약점이란, 응용프로그램이 응용프로그램의 개발자가 개발한 코드(로직)에서 예상하지 못한 값을 입력 받았을 때, 발생하는 오류, 버그 등을 이용하는 것으로서, 공격자는 취약점을 통해 비정상 종료로 인한 서비스 거부, 원격 코드 실행 등의 악성 행위를 실행할 수 있다.The reversing engine may include a debugging engine that may be used for debugging analysis. The debugging engine can diagnose vulnerabilities occurring in document input, processing, and output stages by debugging the process of reading non-executable files. Vulnerability here refers to the use of errors and bugs that occur when an application program receives an unexpected value from the code (logic) developed by the application developer. Malicious actions such as remote code execution can be executed.

CDR(Contents Disarm and Reconstruction)Content Disarm and Reconstruction (CDR)

CDR 서비스는 비실행 파일을 분해해 악성파일 혹은 불필요한 파일을 제거하고 콘텐츠는 원본과 최대한 동일하게 하여, 새로운 파일을 만드는 솔루션이다.The CDR service is a solution that disassembles non-executable files, removes malicious or unnecessary files, and creates new files by making the contents the same as the original as much as possible.

즉, Contents Disarm and Reconstruction(CDR)은 문서 내의 컨텐츠를 무해화(Disarm)하고 재조합(Reconstruction)하여 안전한 문서를 만들어 고객에게 제공하는 서비스를 의미하며, 무해화 대상 파일은 비실행 파일 일체(예를 들어, 워드, 엑셀, 파워포인트, 한글, PDF)를 대상으로 할 수 있으며, 무해화 대상 컨텐츠는 액티브 컨텐츠(예를 들어, 매크로, 하이퍼링크, OLE 객체 등)일 수 있다.In other words, Contents Disarm and Reconstruction (CDR) means a service that disarms and reconstructs the contents in a document to create a safe document and provides it to customers. For example, Word, Excel, PowerPoint, Hangul, PDF) may be targeted, and the harmless target content may be active content (eg, macro, hyperlink, OLE object, etc.).

도 2는 본 명세서에 적용될 수 있는 비정상 입력의 예시이다.2 is an example of an abnormal input that can be applied to this specification.

도 2를 참조하면, 응용프로그램은 비실행 파일을 통해, 비정상적인 값(예를 들어, 입력값이 정상범위인 2를 초과하는 경우)을 입력 받는 경우, 개발자가 의도하지 않은 실행흐름으로 변경되어 취약점이 동작될 수 있다. 디버깅 엔진은 문서 열람 과정을 자동 디버깅하여 취약점과 관련된 특정 지점에 브레이크 포인트를 설정하고 입력값과 관련된 특정값을 확인하여 입력값이 취약점을 일으키는 값인지 아닌지 판별하여 악성 여부를 진단할 수 있다.Referring to FIG. 2, when an application program receives an abnormal value (for example, when the input value exceeds the normal range of 2) through a non-executable file, the application program is changed into an execution flow unintended by the developer and thus vulnerable. this can work. The debugging engine automatically debugs the document browsing process, sets a breakpoint at a specific point related to the vulnerability, checks a specific value related to the input value, determines whether the input value is a value that causes a vulnerability, and diagnoses whether the input value is malicious.

보다 자세하게, 디버깅 엔진은 비실행 파일을 확인하고 이를 열람하기 위한 응용프로그램을 실행하여 디버깅을 시작할 수 있다. 비실행 파일을 열람하는 과정에서 모듈이 로드되면, 디버깅 엔진은 해당 모듈이 분석 대상 모듈인지 확인하고, 분석 대상이라면 지정된 주소에 브레이크 포인트를 설정할 수 있다.More specifically, the debugging engine can start debugging by identifying non-executable files and running an application to view them. If a module is loaded while viewing a non-executable file, the debugging engine checks whether the module is an analysis target module, and if it is an analysis target, it can set a breakpoint at a designated address.

예를 들어, 악성 비실행 파일은 응용프로그램의 버전이나 운영체제 환경 등의 특정 조건이 만족하지 않으면 응용프로그램을 종료하거나 아무런 악성 행위가 발생하지 않는 흐름으로 분기하는 분기 지점들을 가질 수 있다. 서버는 사전에 분석가에 의해 분석되어 이러한 가능성을 가지는 분기 지점에 브레이크 포인트를 설정할 수 있다. For example, a malicious non-executable file may have branching points at which an application program is terminated or branched into a flow in which no malicious activity occurs unless a specific condition such as an application version or an operating system environment is satisfied. The server can set a breakpoint at a divergence point that has been previously analyzed by an analyst and has this possibility.

또한, 서버는 해당 분기 지점과 연관되어, 응용프로그램을 종료하지 않고 계속 실행하거나 악성 행위가 발생할 수 있는 흐름으로 유도할 수 있는 조건들을 설정할 수 있다.In addition, the server may set conditions associated with a corresponding branching point to continuously execute the application program without terminating or lead to a flow in which a malicious action may occur.

응용프로그램의 프로세스 실행 중 해당 브레이크 포인트 지점에서 프로세스가 멈춘 경우, 서버는 탐지 로직에 따라 취약점 여부를 탐지한 후, 결과를 분석 리포트에 저장하는 단계를 수행할 수 있다.If the process stops at the corresponding breakpoint while the process of the application program is running, the server may perform a step of detecting whether or not there is a vulnerability according to the detection logic and then storing the result in an analysis report.

서버에 포함된 자동화 리버싱 엔진은 전술한 단계들을 자동으로 수행하면서 분석하여 분석가가 연구, 개발한 진단 알고리즘을 통해, 악성 비실행 파일을 진단하고 차단할 수 있다.The automated reversing engine included in the server can analyze and diagnose malicious non-executable files through a diagnosis algorithm researched and developed by an analyst by automatically performing and analyzing the above steps.

도 3은 본 명세서가 적용될 수 있는 URI 구성을 예시한다.3 illustrates a URI configuration to which this specification can be applied.

도 3을 참조하면, 본 명세서에서 무해화 대상이 되는 링크정보인 URI(Uniform Resource Identifier)를 예시한다.Referring to FIG. 3, a URI (Uniform Resource Identifier), which is link information to be harmless in this specification, is exemplified.

일반적으로 URI 구문(syntax)은 scheme, authority, path, query, 및 fragment를 포함할 수 있다. In general, URI syntax may include scheme, authority, path, query, and fragment.

표 1은 본 명세서가 적용될 수 있는 URI 구문의 계층적 시퀀스의 예시이다.Table 1 is an example of a hierarchical sequence of URI syntax to which this specification can be applied.

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
URI = scheme ":" hier-part ["?" query ] ["#" fragment]

hier-part="//" authority path-abempty
/path-absolute
/path-rootless
/path-empty

예를 들어, URI 구문은 다음의 표 1과 같은 계층적 시퀀스로 구성될 수 있다.도 3 및 표 1을 참조하면, URI에서 “/”와 관련된 규칙은 다음과 같을 수 있다.For example, the URI syntax may be composed of a hierarchical sequence as shown in Table 1 below. Referring to FIG. 3 and Table 1, rules related to “/” in the URI may be as follows.

(1) When authority is present, the path must either be empty or begin with a slash ("/") character.(1) When authority is present, the path must either be empty or begin with a slash ("/") character.

(2) When authority is not present, the path cannot begin with two slash characters ("//").(2) When authority is not present, the path cannot begin with two slash characters ("//").

따라서, URI 에서는 authority의 존재 여부에 따라, path와 관련된 “/”의 개수가 정해질 수 있다. 예를 들어, 서버는 “/”를 통해, authority를 판단할 수 있다.Therefore, in the URI, the number of “/” related to the path can be determined depending on whether the authority exists. For example, the server can determine the authority through “/”.

만일, 무해화 작업을 통해, URI를 모두 제거하면, 오피스 문서에서 링크 표시가 사라지는 경우가 생겨 무해화 결과물이 원본과 레이아웃이 달라질 수가 있다. 이러한 문제가 발생하지 않게 하기 위해, 본 명세서에서는 링크 정보를 무해화하는 방안으로 scheme 부터 슬래시(“/”)까지만 남기도록 할 수 있다. If all URIs are removed through the harmonization process, links may disappear from office documents, and the result of harmonization may differ from the original layout. In order to prevent this problem from occurring, in the present specification, as a method of harmless link information, only a slash ("/") from a scheme may be left.

이를 통해 무해화 대상이 되는 문서는 레이아웃을 유지할 수 있고, 사용자는 기존 링크 정보가 어떤 형태(예: http, file, mailto 등)였는지를 직관적으로 인식할 수 있게 한다.Through this, the layout of the document to be harmless can be maintained, and the user can intuitively recognize what form (eg, http, file, mailto, etc.) of the existing link information was.

표 2는 본 명세서가 적용될 수 있는 무해화 결과의 예시이다.Table 2 is an example of detoxification results to which the present specification can be applied.

원본original 무해화 결과harmless result foo://example.com:8042/over/there?name=ferret#nosefoo://example.com:8042/over/there?name=ferret#nose foo://foo:// urn:example:animal:ferret:noseurn:example:animal:ferret:nose urn:urn: https//seculetter.comhttps://seculetter.com https://https:// mailto:anesin@seculleter.commailto:anesin@seculleter.com mailto:mailto:

도 4는 본 명세서가 적용될 수 있는 DocumentSummaryInformation 스트림의 무해화 방법을 예시한다.4 illustrates a method of harmless a DocumentSummaryInformation stream to which this specification can be applied.

도 4를 참조하면, 서버의 DocumentSummaryInformation 스트림 무해화 방법을 예시한다.Referring to FIG. 4, a method of disarming a DocumentSummaryInformation stream of a server is exemplified.

CFB 계열의 파일에 대해 압축을 해제하면, 디렉토리와 파일 구조를 확인할 수 있다. 이 때 디렉토리 형태를 스토리지(storage), 파일 형태를 스트림(stream)이라고 한다. If you unzip the CFB-type files, you can check the directory and file structure. At this time, the directory type is called storage, and the file type is called stream.

예를 들어, DOC, PPT, XLS 포맷들은 DocumentSummaryInformation 스트림을 포함할 수 있다.For example, DOC, PPT, and XLS formats may contain a DocumentSummaryInformation stream.

DocumentSummaryInformation 스트림은 문서에 대한 메타정보를 포함할 수 있다. 따라서, 사용자는 DocumentSummaryInformation 스트림의 메타정보를 확인할 수도, 확인하지 못할 수도 있다. DocumentSummaryInformation 스트림에도 링크정보가 포함될 수 있으므로, 이에 대한 무해화 작업이 요구된다.The DocumentSummaryInformation stream may include meta information about a document. Accordingly, the user may or may not check the meta information of the DocumentSummaryInformation stream. Since link information can be included in the DocumentSummaryInformation stream, harmless work is required.

서버는 DocumentSummaryInformation 스트림에서 PropertySetStream 레코드를 확인한다(S4010). 예를 들어, 서버는 비실행 파일의 포맷이 CFB 계열인 경우, DocumentSummaryInformation 스트림에서 순차 검색을 통해, PropertySetStream 레코드를 확인할 수 있다. 보다 자세하게, DocumentSummaryInformation 스트림은 PropertySetStream 레코드를 포함할 수 있다.The server checks the PropertySetStream record in the DocumentSummaryInformation stream (S4010). For example, if the format of the non-executable file is CFB-based, the server can check the PropertySetStream record through sequential search in the DocumentSummaryInformation stream. More specifically, the DocumentSummaryInformation stream can contain PropertySetStream records.

관련하여, 본 명세서에 적용될 수 있는 명세(Spec)는 다음과 같다.In relation to this, specifications that can be applied to this specification are as follows.

[MS-OLEPS]: Object Linking and Embedding (OLE) Property Set Data Structures [MS-OLEPS]: Object Linking and Embedding (OLE) Property Set Data Structures

(https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-oleps/bf7aeae8-c47a-4939-9f45-700158dac3bc)(https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-oleps/bf7aeae8-c47a-4939-9f45-700158dac3bc)

1.One. IntroductionIntroduction

이 문서는 일반적으로 단순 타입 메타데이터를 파일과 연결하는 데 사용되는 속성들의(properties) 셋에 대한 generic persistence format 인 Object Linking and Embedding (OLE) Property Set Data Structures (OLEPS)를 지정한다. 응용 프로그램이 메타데이터를 다른 소프트웨어에서 검색할 수 있도록 하기 위해, 잘 알려진 게시 포맷 또는 응용 프로그램 정의 포맷 중 하나의 property set format을 선택하고, 이 포맷에 지정된 속성을 포함하는 property set을 작성한다. Compound File Binary File Format (자세한 내용은 [MS-CFB] 참조) 또는 특정 파일 시스템의 대체 사용자 데이터 스트림 기능과 같이 단일 물리적 파일에서 여러 가상 스트림을 지원하는 기술과 결합하면, 하나 이상의 property set을 파일과 연결할 수 있다. 이를 통해 응용 프로그램은 파일 포맷의 응용 프로그램별 부분 파싱(parsing)을 지원하지 않는 소프트웨어에서 파일의 속성을 검색할 수 있다.This document specifies Object Linking and Embedding (OLE) Property Set Data Structures (OLEPS), a generic persistence format for a set of properties commonly used to link simple type metadata with files. To enable applications to retrieve metadata from other software, select a property set format, either a well-known publishing format or an application-defined format, and create a property set containing the properties specified in this format. When combined with technologies that support multiple virtual streams in a single physical file, such as the Compound File Binary File Format (see [MS-CFB] for details) or the Alternate User Data Streams feature of certain file systems, one or more property sets are associated with the file. can connect Through this, the application program can search the attributes of the file in software that does not support parsing of each application program of the file format.

2.2. StructuresStructures

2.19 PropertyIdentifierAndOffset2.19 PropertyIdentifierAndOffset

PropertyIdentifierAndOffset 패킷은 PropertySet 패킷에서 property identifier와 property의 바이트 오프셋을 나타내는 데 사용된다.The PropertyIdentifierAndOffset packet is used to indicate the property identifier and the byte offset of the property in the PropertySet packet.

PropertyIdentifierAndOffset 패킷은 다음의 필드를 포함할 수 있다 :A PropertyIdentifierAndOffset packet may contain the following fields:

PropertyIdentifier (4 bytes): property set에 있는 property 의 속성 식별자를 나타내는 부호 없는 정수이다. 올바른 PropertyIdentifier 값이어야 한다.PropertyIdentifier (4 bytes): An unsigned integer representing the property identifier of the property in the property set. Must be a valid PropertyIdentifier value.

Offset (4 bytes): PropertySet 패킷의 시작 부분부터 표시된 속성에 대한 Property field의 시작 부분까지의 오프셋(바이트)을 나타내는 부호 없는 정수이다. 4바이트의 배수여야 한다.Offset (4 bytes): An unsigned integer representing the offset (bytes) from the beginning of the PropertySet packet to the beginning of the Property field for the indicated property. Must be a multiple of 4 bytes.

즉, PropertyIdentifier 에서는 다음에 나올 Property 에 대한 식별자 (PropertyIdentifier)가 포함되어 있다. 또한, Offset 은 PropertySet 시작 주소를 기준으로 한 값이 된다.That is, in PropertyIdentifier, the identifier (PropertyIdentifier) for the next property is included. Also, Offset becomes a value based on the PropertySet start address.

2.20 PropertySet2.20 PropertySets

PropertySet packet은 property set을 나타낸다.A PropertySet packet represents a property set.

도 5는 본 명세서가 적용될 수 있는 PropertySet의 예시이다.5 is an example of a PropertySet to which this specification can be applied.

도 5를 참조하면, PropertySet packet은 다음의 필드를 포함할 수 있다 :Referring to FIG. 5, the PropertySet packet may include the following fields:

Size (4 bytes): PropertySet 패킷의 총 크기(바이트)여야 한다.Size (4 bytes): This should be the total size of the PropertySet packet (in bytes).

NumProperties (4 bytes): property set의 속성 수를 나타내는 부호 없는 정수이다.NumProperties (4 bytes): An unsigned integer representing the number of properties in the property set.

PropertyIdentifierAndOffset 0 (variable): 모든 PropertyIdentifierAndOffset 필드는 PropertyIdentifierAndOffset 패킷의 시퀀스여야 한다. 이 시퀀스는 Offset 필드의 값이 증가하는 순서여야 한다. 패킷들은 PropertyIdentifier 필드의 값과 관련하여 특정 순서를 필요로 하지 않는다.PropertyIdentifierAndOffset 0 (variable): All PropertyIdentifierAndOffset fields MUST be sequences of PropertyIdentifierAndOffset packets. This sequence must be in increasing order of the value of the Offset field. Packets do not require any particular order with respect to the value of the PropertyIdentifier field.

Property 0 (variable): 각 Property field는 속성 값의 시퀀스이며, 각 속성 값은 Dictionary 속성이 특수한 경우 TypePropertyValue 패킷 또는 Dictionary 패킷으로 표현되어야 한다.Property 0 (variable): Each Property field is a sequence of property values, and each property value must be expressed in a TypePropertyValue packet or Dictionary packet if the Dictionary property is special.

2.21 PropertySetStream2.21 PropertySetStream

PropertySetStream 패킷은 simple property sets에 대한 스트림 포맷과 Non-Simple Property Set Storage Format의 CONTENTS 스트림에 대한 스트림 포맷을 지정한다. simple property set은 PropertySetStream 패킷을 포함하는 스트림으로 표시되어야 한다.The PropertySetStream packet specifies the stream format for simple property sets and the CONTENTS stream for Non-Simple Property Set Storage Format. A simple property set MUST be represented as a stream containing PropertySetStream packets.

PropertySetStream 패킷은 일반적으로 정확히 하나의 property set을 나타내지만 historical 이유로, DocumentSummaryInfo 및 UserDefinedProperties property sets이 동일한 스트림에 표시될 수 있다. 이 특별한 경우 PropertySetStream은 두 개의 property sets을 나타낼 수 있다.PropertySetStream packets typically represent exactly one property set, but for historical reasons, DocumentSummaryInfo and UserDefinedProperties property sets may appear in the same stream. In this particular case, a PropertySetStream can represent two property sets.

implementation에서는 PropertySetStream 패킷의 총 크기에 대한 제한을 적용해야 한다. 이러한 제한은 최소 262,144바이트여야 하며 최대 상호 운용성을 위해 2,097,152바이트여야 한다.Implementations must enforce limits on the total size of PropertySetStream packets. These limits must be at least 262,144 bytes and 2,097,152 bytes for maximum interoperability.

도 6은 본 명세서가 적용될 수 있는 PropertySetStream의 예시이다.6 is an example of PropertySetStream to which this specification can be applied.

도 6을 참조하면, PropertySetStream packet은 다음의 필드를 포함할 수 있다 :Referring to FIG. 6, the PropertySetStream packet may include the following fields:

ByteOrder (2 bytes): MUST be set to 0xFFFE.ByteOrder (2 bytes): MUST be set to 0xFFFE.

Version (2 bytes): property set (or property sets)의 버전 번호를 나타내는 부호 없는 정수. MUST be 0x0000 or 0x0001.Version (2 bytes): An unsigned integer representing the version number of the property set (or property sets). MUST be 0x0000 or 0x0001.

SystemIdentifier (4 bytes): 어플리케이션에 이 값을 보고하는 경우를 제외하고 무시해야 하는 implementation 관련 값.SystemIdentifier (4 bytes): implementation-specific value that should be ignored unless reporting this value to the application.

CLSID (16 bytes): property set (or property sets)과 관련된 CLSID를 나타내는 GUID(패킷 버전) 패킷이어야 합니다.CLSID (16 bytes): Must be a packet version (GUID) indicating the CLSID associated with the property set (or property sets).

NumPropertySets (4 bytes): 이 PropertySetStream 구조로 표시되는 property sets의 수를 나타내는 부호 없는 정수. 0x00000001 또는 0x00000002여야 한다.NumPropertySets (4 bytes): An unsigned integer representing the number of property sets represented by this PropertySetStream structure. Must be 0x00000001 or 0x00000002.

표 3은 NumPropertySets 값의 예시이다.Table 3 is an example of NumPropertySets values.

Figure 112022110313760-pat00001
Figure 112022110313760-pat00001

FMTID0 (16 bytes): PropertySet 0 필드가 나타내는 property set의 FMTID로 설정해야 하는 GUID. NumPropertySets의 값이 0x00000002이면, 이 GUID를 FMTID_DocSummaryInformation ({D5CDD502-2E9C-101B-9397-08002B2CF9AE})로 설정해야 한다.FMTID0 (16 bytes): A GUID that should be set to the FMTID of the property set represented by the PropertySet 0 field. If the value of NumPropertySets is 0x00000002, then this GUID should be set to FMTID_DocSummaryInformation ({D5CDD502-2E9C-101B-9397-08002B2CF9AE}).

Offset0 (4 bytes): 이 PropertySetStream 구조의 시작에서 PropertySet 0 필드의 시작까지 바이트 단위로 오프셋으로 설정해야 하는 부호 없는 정수.Offset0 (4 bytes): An unsigned integer that should be set as the offset in bytes from the start of this PropertySetStream structure to the start of the PropertySet 0 field.

FMTID1 (16 bytes): NumPropertySets의 값이 0x00000002이면 FMTID_UserDefinedProperties({D5CDD505-2E9C-101B-9397-08002B2CF9AE})로 설정해야 한다. 그렇지 않으면, 존재하지 않음.FMTID1 (16 bytes): If the value of NumPropertySets is 0x00000002, it should be set as FMTID_UserDefinedProperties ({D5CDD505-2E9C-101B-9397-08002B2CF9AE}). otherwise, it does not exist.

Offset1 (4 bytes): NumPropertySets의 값이 0x00000002인 경우 이 PropertySetStream 구조의 시작에서 PropertySet 1 필드 시작까지의 바이트 단위의 오프셋으로 설정해야 한다. 그렇지 않으면, 존재하지 않음.Offset1 (4 bytes): If the value of NumPropertySets is 0x00000002, it must be set as an offset in bytes from the start of this PropertySetStream structure to the start of PropertySet 1 field. otherwise, it does not exist.

PropertySet0 (variable): PropertySet packet이어야 한다.PropertySet0 (variable): Must be a PropertySet packet.

PropertySet1 (variable): NumPropertySets의 값이 0x00000002이면 PropertySet 패킷이어야 한다. 그렇지 않으면, 존재하지 않음.PropertySet1 (variable): If the value of NumPropertySets is 0x00000002, it must be a PropertySet packet. otherwise, it does not exist.

Padding (variable): implementation에 의해 추가된 추가 패딩을 포함한다. 패딩이 있는 경우 패딩은 0이어야 하며 무시되어야 한다.Padding (variable): Contains any additional padding added by the implementation. Padding, if present, should be zero and should be ignored.

2.23 Property Set Stream and Storage Names2.23 Property Set Stream and Storage Names

property set을 나타내는 스트림 또는 스토리지는 스토리지의 element일 수 있다. 예를 들어 compound file의 property set 스트림 또는 스토리지에 대한 표준 바인딩은 각각 파일의 루트 스토리지의 element여야 한다. 이 섹션에서는 property set의 FMTID와 property set을 나타내는 스트림 또는 스토리지 element의 이름 사이의 표준 매핑을 지정하여 이러한 방식으로 저장된 property set을 검색할 수 있도록 한다.A stream or storage representing a property set may be an element of storage. For example, a standard binding to a property set stream or storage in a compound file must be an element of the file's root storage, respectively. This section specifies a standard mapping between a property set's FMTID and the name of the stream or storage element representing the property set, allowing you to retrieve property sets stored in this way.

OLEPS implementation는 이 표준 매핑에 따라 파생된 이름을 가진 element를 property set에 사용하는 메커니즘을 제공해야 하지만, implementation는 이 규칙을 따르지 않는 하나 이상의 다른 메커니즘을 추가로 제공할 수 있다. 예를 들어, implementation은 property set을 임의 응용 프로그램이 제공하는 스트림 컨테이너 또는 스토리지 컨테이너에 저장할 수 있는 메커니즘을 제공할 수 있다.An OLEPS implementation MUST provide a mechanism for using an element with a derived name in a property set according to this standard mapping, but the implementation MAY additionally provide one or more other mechanisms that do not conform to this convention. For example, an implementation may provide a mechanism to store property sets in an arbitrary application-provided stream container or storage container.

표 4는 property set 스트림 및 스토리지의 표준 이름의 지정을 예시한다.Table 4 illustrates the designation of standard names for property set streams and storage.

PropertySetStreamOrStorageName  =  %x05 ("SummaryInformation" /
 "DocumentSummaryInformation" / "GlobalInfo" / "ImageContents" /
 "ImageInfo" / 26(ALPHA / "0" / "1" / "2" / "3" / "4" / "5") )
PropertySetStreamOrStorageName = %x05 ("SummaryInformation" /
"DocumentSummaryInformation" / "GlobalInfo" / "ImageContents" /
"ImageInfo" / 26(ALPHA / "0" / "1" / "2" / "3" / "4" / "5") )

표 5는 special-case FMTID의 예시이다.Table 5 is an example of special-case FMTID.

Figure 112022110313760-pat00002
Figure 112022110313760-pat00002

다시 도 4를 참조하면, 서버는 PropertySetStream 레코드의 NumPropertySets의 필드값을 확인한다(S4020).Referring back to FIG. 4, the server checks the field values of NumPropertySets of the PropertySetStream record (S4020).

NumPropertySets의 필드값이 2를 나타내는 것에 근거하여, 서버는 FMTID0 및 FMTID1의 필드값이 정당한지 판단한다(S4030). 예를 들어, NumPropertySets의 필드값이 2를 나타내는 경우, FMTID0 필드값은 D5CDD502-2E9C-101B-9397-08002B2CF9AE 값을 갖으며, FMTID1 필드값은 D5CDD505-2E9C-101B-9397-08002B2CF9AE 값을 갖을 수 있다. 서버는 FMTID0 필드값이 D5CDD502-2E9C-101B-9397-08002B2CF9AE이고, FMTID1 필드값이 D5CDD505-2E9C-101B-9397-08002B2CF9AE 인 경우, 이를 정당하다고 판단할 수 있다.Based on the field value of NumPropertySets indicating 2, the server determines whether the field values of FMTID0 and FMTID1 are valid (S4030). For example, when the field value of NumPropertySets indicates 2, the FMTID0 field value may have a value of D5CDD502-2E9C-101B-9397-08002B2CF9AE, and the FMTID1 field value may have a value of D5CDD505-2E9C-101B-9397-08002B2CF9AE. . When the FMTID0 field value is D5CDD502-2E9C-101B-9397-08002B2CF9AE and the FMTID1 field value is D5CDD505-2E9C-101B-9397-08002B2CF9AE, the server may determine that this is legitimate.

서버는 FMTID0 및 FMTID1의 필드값이 정당한 것에 근거하여, VtHyperlinks 레코드를 확인한다(S4040).The server checks the VtHyperlinks record based on whether the field values of FMTID0 and FMTID1 are valid (S4040).

예를 들어, 서버는 Offset1에 근거하여, PropertySet 1 필드를 탐색할 수 있다. PropertySet 1 필드는 User Defined Property Set을 포함할 수 있다.For example, the server may search for the PropertySet 1 field based on Offset1. The PropertySet 1 field may include User Defined Property Set.

User Defined Property Set은 "\005DocumentSummaryInformation” 문서 스트림에 포함되어 있으며, 임의 타입의 properties 및 값이 포함되어 있다.User Defined Property Set is included in the "\005DocumentSummaryInformation" document stream, and includes arbitrary types of properties and values.

예를 들어, User Defined Property Set은 다음의 property 3개를 포함할 수 있다 : Dictionary Property, CodePage Property, TypedPropetyValueFor example, User Defined Property Set can include the following three properties: Dictionary Property, CodePage Property, and TypedPropetyValue

도 7은 본 명세서가 적용될 수 있는 DocumentSummaryInformation7 is DocumentSummaryInformation to which this specification can be applied 스트림의 예시이다.This is an example of a stream.

도 7을 참조하면, DocumentSummaryInformation 스트림은 Dictionary Property([01000000 02000000 0C000000 5F504944 5F484C49 4E4B5300]), CodePage Property([02000000 13270000]), TypedPropetyValue([41000000 ...])를 포함할 수 있다.Referring to FIG. 7 , the DocumentSummaryInformation stream may include Dictionary Property ([01000000 02000000 0C000000 5F504944 5F484C49 4E4B5300]), CodePage Property ([02000000 13270000]), and TypedPropetyValue ([41000000 ...]).

예를 들어, [5F504944 5F484C49 4E4B5300]는 Name 필드이며, “_PID_HLINKS”를 나타낼 수 있다. 또한, [13270000]는 0x2713 (10003)인 경우, DictionaryEntry 패킷의 문자열은 Korean (Mac)으로 인코딩 되었음을 의미할 수 있다.For example, [5F504944 5F484C49 4E4B5300] is a Name field and may indicate “_PID_HLINKS”. Also, [13270000] may mean that the string of the DictionaryEntry packet is encoded in Korean (Mac) when it is 0x2713 (10003).

관련하여, 본 명세서에 적용될 수 있는 명세(Spec)는 다음과 같다.In relation to this, specifications that can be applied to this specification are as follows.

2.15 TypedPropertyValue2.15 TypedPropertyValue

TypedPropertyValue 구조는 property set에 있는 property의 typed value를 나타낸다. The TypedPropertyValue structure represents the typed value of a property in a property set.

TypedPropertyValue는 다음의 필드를 포함할 수 있다:A TypedPropertyValue can contain the following fields:

Type (2 bytes): 표시된 property의 타입을 나타내는 PropertyType enumeration에서의 값이어야 한다.Type (2 bytes): Must be a value in the PropertyType enumeration that indicates the type of the displayed property.

Padding (2 bytes): 0으로 설정해야 하며 0이 아닌 값은 거부되어야 한다.Padding (2 bytes): Must be set to 0, non-zero values must be rejected.

Value (variable): 다음과 같은 Type의 값에 따라 표현되고 일련화된 property의 값이어야 한다.Value (variable): It must be the value of a serialized property that is expressed according to the value of the following Type.

표 6은 Type의 예시이다.Table 6 is an example of Type.

Figure 112022110313760-pat00003
Figure 112022110313760-pat00003

2.18 Special Properties2.18 Special Properties

다음 섹션에서 특별한 표현, 사용 또는 제한이 있는 properties에 대한 추가 정보를 제공한다.The following sections provide additional information about properties that have special representations, uses, or restrictions.

2.18.1 Dictionary Property2.18.1 Dictionary Property

Dictionary property가 있는 경우 property 식별자는 0x000000이어야 하며 property 이름을 가질 수 없다. TypePropertyValue 패킷으로 표시되는 다른 property와 달리 Dictionary property은 Dictionary 패킷으로 표시되어야 한다. If there is a dictionary property, the property identifier must be 0x000000 and cannot have a property name. Unlike other properties that are represented by the TypePropertyValue packet, the Dictionary property must be represented by the Dictionary packet.

2.18.2 CodePage Property2.18.2 CodePage Property

CodePage 속성(property)은 속성 식별자(property identifier) 0x00000001이어야 하고 속성 이름(property name)은 없어야 하며 타입은 VT_I2(0x0002)여야 한다. 모든 property set에는 CodePage 속성이 있어야 하며 그 값은 [MS-UCODEREF] 섹션 2.2.1에 명시된 대로 유효한 코드 페이지 식별자(code page identifier)여야 한다. 이 값은 구현별 방식으로 선택된다.The CodePage property must have a property identifier of 0x00000001, no property name, and a type of VT_I2 (0x0002). Every property set must have a CodePage attribute and its value must be a valid code page identifier as specified in [MS-UCODEREF] section 2.2.1. This value is chosen in an implementation-specific way.

속성 집합의 CodePage 속성은 CodePageString 및 DictionaryEntry 패킷의 표현에 영향을 미친다. 값 CP_위니코드(0x04B0)는 이러한 패킷의 문자열이 16비트 유니코드 문자의 배열로 인코딩되었음을 나타낸다. 다른 값은 이러한 패킷의 문자열이 식별된 코드 페이지에서 8비트 문자의 배열로 인코딩되었음을 나타낸다.The CodePage property in the property set affects the presentation of CodePageString and DictionaryEntry packets. The value CP_winicode (0x04B0) indicates that the strings in these packets are encoded as arrays of 16-bit Unicode characters. Any other value indicates that the strings in these packets are encoded as arrays of 8-bit characters in the identified code page.

예를 들어, CodePage Property 구조는 TypePropertyValue과 동일할 수 있다.For example, CodePage Property structure may be the same as TypePropertyValue.

보다 자세하게, CodePage Property는 TypedPropetyValue의 Value 필드와 대응되는 값을 통해, DictionaryEntry 패킷의 문자열이 어떤 방식으로 인코딩 되었는지를 나타낼 수 있다.In more detail, the CodePage Property may indicate how the string of the DictionaryEntry packet is encoded through a value corresponding to the Value field of TypedPropetyValue.

2.17 Dictionary2.17 Dictionary

Dictionary 패킷은 property set에서 property 식별자와 property 이름 간의 모든 매핑을 나타낸다. 예를 들어, Dictionary 패킷에 포함된 모든 Entry field는 일련의 DictionaryEntry 패킷이어야 한다.Dictionary packets represent all mappings between property identifiers and property names in a property set. For example, every Entry field contained in a Dictionary packet must be a series of DictionaryEntry packets.

2.16 DictionaryEntry2.16 DictionaryEntry

DictionaryEntry 패킷은 property 식별자와 property 이름 간의 매핑을 나타낸다. DictionaryEntry 패킷은 Name 필드를 포함한다.A DictionaryEntry packet represents a mapping between property identifiers and property names. A DictionaryEntry packet contains a Name field.

예를 들어, Name 필드는 reserved name으로 “_PID_HLINKS”를 포함할 수 있다. reserved name과 관련된 명세는 다음과 같다.For example, the Name field may include “_PID_HLINKS” as a reserved name. The specifications related to the reserved name are as follows.

[MS-OSHARED]: Office Common Data Types and Objects Structures[MS-OSHARED]: Office Common Data Types and Objects Structures

(https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-oshared/d93502fa-5b8f-4f47-a3fe-5574046f4b8d)(https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-oshared/d93502fa-5b8f-4f47-a3fe-5574046f4b8d)

Microsoft Office 97, Microsoft Office XP, Microsoft Office 2003 및 2007 Microsoft Office 시스템 문서에서 일반적으로 사용되는 데이터 타입 및 데이터 구조인 Office Common Data Types 및 Objects Structure를 지정한다.Specifies Office Common Data Types and Objects Structure, which are commonly used data types and data structures in Microsoft Office 97, Microsoft Office XP, Microsoft Office 2003, and 2007 Microsoft Office system documents.

2 Structures2 Structures

2.3 Common Objects2.3 Common Objects

2.3.3 Property Set Storage2.3.3 Property Set Storage

OLE property set 스토리지는 property set의 colletion을 저장하는 방법을 지정하는 [MS-OLEPS]에 지정된 포맷이다. 이 섹션에서는 이 포맷에 적용할 수 있는 property set 및 데이터 포맷을 지정한다. Summary Information (섹션 2.3.3.2.1) 속성 세트는 Section 2.3.3 로 작성되어야 한다. Document Summary Information (섹션 2.3.3.2.2) 및 User Defined (섹션 2.3.3.2.3) property set은 선택 사항이다.OLE property set storage is a format specified in [MS-OLEPS] that specifies how to store a collection of property sets. This section specifies the property set and data format applicable to this format. The Summary Information (Section 2.3.3.2.1) attribute set should be written in Section 2.3.3. The Document Summary Information (Section 2.3.3.2.2) and User Defined (Section 2.3.3.2.3) property sets are optional.

2.3.3.2 OLE Property Sets2.3.3.2 OLE Property Sets

이 섹션에서는 [MS-OLEPS]에 지정된 대로 property set 스토리지 스트림의 포맷을 정의한다. 이 포맷은 Summary Information (섹션 2.3.3.2.1) 및 Document Summary Information (섹션 2.3.3.2.2) 스트림에 적용된다.This section defines the format of the property set storage stream as specified in [MS-OLEPS]. This format applies to the Summary Information (Section 2.3.3.2.1) and Document Summary Information (Section 2.3.3.2.2) streams.

2.3.3.2.3 User Defined Property Set2.3.3.2.3 User Defined Property Set

이 섹션에서는 [MS-OLEPS]에 지정된 대로 임의의 user-defined properties을 포함하는 단순 OLE property set을 정의한다. 이 property set은 FMTID_UserDefinedProperties property set의 스트림 이름 요구사항 및 포맷 식별자 GUID와 관련하여 [MS-OLEPS] 섹션 2.21 및 [MS-OLEPS] 섹션 2.23을 준수한다. User Defined property set은 "\005DocumentSummary"라는 문서 스트림에 포함되어 있다This section defines a simple OLE property set containing arbitrary user-defined properties as specified in [MS-OLEPS]. This property set conforms to [MS-OLEPS] section 2.21 and [MS-OLEPS] section 2.23 with respect to stream name requirements and format identifier GUIDs in the FMTID_UserDefinedProperties property set. The User Defined property set is included in the document stream named "\005DocumentSummary"

2.3.3.2.3.2 Reserved Properties2.3.3.2.3.2 Reserved Properties

User Defined property set (섹션 2.3.3.2.3)에는 특정 데이터를 위해 예약된 여러 name이 있다.The User Defined property set (Section 2.3.3.2.3) has several names reserved for specific data.

하이퍼링크와 관련된 reserved name은 “_PID_HLINKS”이며, VtHyperlinks property (섹션 2.3.3.1.21)이어야 하고, 문서에 포함된 하이퍼링크 목록을 지정한다.The reserved name related to hyperlinks is “_PID_HLINKS”, which must be the VtHyperlinks property (section 2.3.3.1.21), and specifies the list of hyperlinks included in the document.

따라서, S4040에서 서버는 Dictionary Property가 “_PID_HLINKS”를 포함하고 있는지 확인하여, TypedPropertyValue 내의 VtHyperlinks 레코드를 확인할 수 있다. 이를 위해, 서버는 CodePage Property를 확인하여, Dictionary Property와 관련된 인코딩 방식을 확인할 수 있다. 서버는 인코딩 방식에 근거하여, 문자열 “_PID_HLINKS”를 확인할 수 있다.Therefore, in S4040, the server can check whether the Dictionary Property includes “_PID_HLINKS” and check the VtHyperlinks record in the TypedPropertyValue. To this end, the server can check the CodePage Property and check the encoding method related to the Dictionary Property. The server can check the character string “_PID_HLINKS” based on the encoding method.

서버는 VtHyperlinks 레코드에 근거하여, 링크정보를 무해화한다(S4050).The server detoxifies the link information based on the VtHyperlinks record (S4050).

예를 들어, 서버는 VtHyperlinks 레코드의 vtValue 필드를 통해, VtHyperlinkValue 레코드를 확인하고, VtHyperlinkValue 레코드의 vecHyperlink의 rgHyperlink 필드를 통해, VtHyperlink 배열을 확인할 수 있다. 예를 들어, Dictionary Property가 “_PID_HLINKS”를 포함하고 있는 경우, TypedPropetyValue의 속성은 VtHyperlinks이므로, VtHyperlinks 레코드는 TypedPropetyValue에 포함될 수 있다.For example, the server can check the VtHyperlinkValue record through the vtValue field of the VtHyperlinks record, and check the VtHyperlink array through the rgHyperlink field of vecHyperlink of the VtHyperlinkValue record. For example, if the Dictionary Property includes “_PID_HLINKS”, the TypedPropetyValue property is VtHyperlinks, so the VtHyperlinks record can be included in the TypedPropetyValue.

이후, 서버는 VtHyperlink 레코드의 hlink1 및 hlink2 필드에 대해 링크정보를 무해화 할 수 있다.After that, the server may harm link information for the hlink1 and hlink2 fields of the VtHyperlink record.

관련된 명세는 다음과 같다.The relevant specifications are as follows.

2.3.3.1 Property Types2.3.3.1 Property Types

이 섹션에서는 [MS-OLEPS]에서 제공하는 것보다 더 자세한 사양이 필요한 property data types의 데이터 포맷을 지정한다.This section specifies the data format of property data types that require more detailed specifications than those provided by [MS-OLEPS].

2.3.3.1.21 VtHyperlinks2.3.3.1.21 VtHyperlinks

하이퍼링크 set을 나타내는 property의 format을 지정한다. 이 타입은 [MS-OLEPS] 섹션 2.15에 명시된 VT_BLOB TypedPropertyValue 타입을 준수하지만, 이 타입의 데이터 콘텐츠를 추가로 지정하기 위해 여기에 더 자세히 설명한다.Specifies the format of the property representing the hyperlink set. This type conforms to the VT_BLOB TypedPropertyValue type specified in [MS-OLEPS] section 2.15, but is described in more detail here to further specify the data content of this type.

도 8은 본 명세서가 적용될 수 있는 VtHyperlinks의 예시이다.8 is an example of VtHyperlinks to which the present specification can be applied.

도 8을 참조하면, VtHyperlinks 레코드는 다음의 필드를 포함할 수 있다:Referring to FIG. 8 , the VtHyperlinks record may include the following fields:

wType (2 bytes): VT_BLOB(0x0041)와 같아야 하는 부호 없는 정수wType (2 bytes): unsigned integer which must equal VT_BLOB (0x0041)

padding (2 bytes): 0x0000이어야 하는 부호 없는 정수padding (2 bytes): unsigned integer which must be 0x0000

vtValue (variable): VtHyperlinkValue 구조여야 한다(섹션 2.3.3.1.20).vtValue (variable): MUST be a VtHyperlinkValue structure (Section 2.3.3.1.20).

2.3.3.1.20 VtHyperlinkValue2.3.3.1.20 VtHyperlinkValue

하이퍼링크 property의 데이터를 지정한다. 이 타입은 [MS-OLEPS] 섹션 2.15에 명시된 VT_BLOB TypeedPropertyValue 값 포맷을 준수하지만, 이 섹션은 이 타입에 적용할 수 있는 추가 세부 정보를 지정한다.Specifies the data of the hyperlink property. This type conforms to the VT_BLOB TypedPropertyValue value format specified in [MS-OLEPS] section 2.15, but this section specifies additional details applicable to this type.

VtHyperlinkValue 레코드는 VecVtHyperlink 구조인 vecHyperlink (variable)를 포함할 수 있다.The VtHyperlinkValue record may include vecHyperlink (variable), which is a VecVtHyperlink structure.

2.3.3.1.19 VecVtHyperlink2.3.3.1.19 VecVtHyperlink

하이퍼링크 배열의 데이터 포맷을 지정한다. 여기서 rgHyperlink (variable) 필드는 VtHyperlink 배열(2.3.3.1.18 섹션)을 포함하며, property에 대한 하이퍼링크 목록을 지정한다.Specifies the data format of the hyperlink array. Here, the rgHyperlink (variable) field contains the VtHyperlink array (section 2.3.3.1.18) and specifies a list of hyperlinks to the property.

2.3.3.1.18 VtHyperlink2.3.3.1.18 VtHyperlink

속성(property)에 대한 하이퍼링크의 데이터 포맷을 지정한다.Specifies the data format of hyperlinks to properties.

도 9는 본 명세서가 적용될 수 있는 VtHyperlink의 예시이다.9 is an example of VtHyperlink to which the present specification can be applied.

도 9를 참조하면, VtHyperlink 레코드는 다음의 필드를 포함할 수 있다:Referring to FIG. 9, the VtHyperlink record may include the following fields:

dwHash (8 bytes): [MS-OLEPS] 섹션 2.15에 명시된 VT_I4 TypedPropertyValue이어야 한다. 이 구조의 Value 필드는 hlink1 필드와 hlink2 필드 문자열 값을 입력으로 하여 Hyperlink Hash (섹션 2.4.2) 섹션에 지정된 대로 계산되어야 한다.dwHash (8 bytes): Must be a VT_I4 TypedPropertyValue specified in [MS-OLEPS] section 2.15. The Value field of this structure must be computed as specified in the Hyperlink Hash (Section 2.4.2) section, taking the hlink1 and hlink2 field string values as input.

dwApp (8 bytes): [MS-OLEPS] 섹션 2.15에 명시된 VT_I4 TypedPropertyValue이어야 한다.dwApp (8 bytes): Must be a VT_I4 TypedPropertyValue specified in [MS-OLEPS] section 2.15.

dwOfficeArt (8 bytes): [MS-OLEPS] 섹션 2.15에 명시된 VT_I4 TypedPropertyValue이어야 한다. 이 구조의 Value 필드는 문서에서 하이퍼링크가 적용되는 형상(shape)의 식별자([MS-ODRAW] 섹션 2.2.31)를 지정하는 MSOSPID 타입 값([MS-ODRAW] 섹션 2.1.2)이어야 한다. 이 하이퍼링크가 형상에 적용되지 않는 경우 이 구조의 Value 필드는 0x000000이어야 한다.dwOfficeArt (8 bytes): Must be a VT_I4 TypedPropertyValue specified in [MS-OLEPS] Section 2.15. The Value field of this structure must be a value of type MSOSPID ([MS-ODRAW] section 2.1.2) specifying the identifier ([MS-ODRAW] section 2.2.31) of the shape to which the hyperlink applies. If this hyperlink does not apply to a shape, the Value field of this structure should be 0x000000.

dwInfo (8 bytes): [MS-OLEPS] 섹션 2.15에 명시된 VT_I4 TypedPropertyValue이어야 한다.dwInfo (8 bytes): Must be a VT_I4 TypedPropertyValue specified in [MS-OLEPS] Section 2.15.

hlink1 (variable): hlink1의 VtString 구조(섹션 2.3.3.1.11)여야 한다. wType은 VT_LPWSTR과 같다. hlink1.stringValue는 하이퍼링크 대상(target)을 지정한다.hlink1 (variable): This should be the VtString structure of hlink1 (Section 2.3.3.1.11). wType is the same as VT_LPWSTR. hlink1.stringValue specifies the hyperlink target.

hlink2 (variable): 반드시 hlink2가 있는 tString 구조(섹션 2.3.3.1.11)여야 한다. wType은 VT_LPWSTR과 같다. hlink2.stringValue는 하이퍼링크 위치(location)를 지정한다. hlink2 (variable): MUST be a tString structure (section 2.3.3.1.11) with hlink2. wType is the same as VT_LPWSTR. hlink2.stringValue specifies the hyperlink location.

서버는 hlink1 및 hlink2 필드에서 scheme만 남기거나, “/” 가 존재하는 경우, scheme과 “/” 만 남길 수 있다.The server can leave only the scheme in the hlink1 and hlink2 fields or, if “/” exists, only the scheme and “/”.

또한, 서버는 널(null) 문자(\0)로 링크정보를 제거하지 않고 공백(0x20)으로 무해화를 수행할 수 있다. 널 문자를 사용하지 않는 이유는 일부 문자열에 대한 MS-CFB 명세가 null-terminated string으로 되어 있는 경우가 있기 때문이다.In addition, the server may perform harmless with a blank (0x20) instead of removing link information with a null character (\0). The reason why the null character is not used is that the MS-CFB specifications for some strings are null-terminated strings.

추가적으로, 서버는 무해화된 링크정보에 근거하여, dwHash 필드를 변경할 수 있다. dwHash 필드는 hlink1 필드와 hlink2 필드 문자열 값을 입력으로 하여, 계산된 해쉬값을 갖으므로, 변경된 hlink1 필드와 hlink2 필드에 따라 적절한 값으로 변경해주어야 한다.Additionally, the server may change the dwHash field based on the harmless link information. Since the dwHash field has a calculated hash value by taking the string values of the hlink1 and hlink2 fields as input, it should be changed to an appropriate value according to the changed hlink1 and hlink2 fields.

예를 들어, 적절한 값은 hlink 에 있는 문자열에 대해 2개 문자(Char1, Char2)씩을 조합해 8바이트 값으로 넣고(dwNext = (Char2 << 16) | Char1), 이를 최초 0으로 초기화된 값(dwHash(= 0))에 XOR 로 차례대로 누적한 결과(dwHash ^= dwNext)일 수 있다.For example, an appropriate value is to combine two characters (Char1, Char2) of the string in hlink into an 8-byte value (dwNext = (Char2 << 16) | Char1), which is initialized to zero ( dwHash (= 0)) may be the result of sequentially accumulating XOR (dwHash ^= dwNext).

관련된 명세는 다음과 같다.The relevant specifications are as follows.

2.4.1 Unicode String to Unsigned Integer Hash2.4.1 Unicode String to Unsigned Integer Hash

null-terminated 유니코드 문자열이 주어지면 다음 알고리즘을 수행하여 4바이트 부호 없는 정수 해시 값을 얻을 수 있다.Given a null-terminated Unicode string, the following algorithm can be performed to obtain a 4-byte unsigned integer hash value:

1. 4바이트 부호 없는 정수 값 dwHash는 0x00000000로 설정된다.1. The 4-byte unsigned integer value dwHash is set to 0x00000000.

2. 입력 문자열을 null-terminating 문자가 더해진 255 문자열(characters)로 잘라낸다.2. Cuts the input string into 255 characters plus a null-terminating character.

3. 입력 문자열을 소문자로 변환한다.3. Converts the input string to lower case.

4. 위치 0에서 입력 문자열 끝까지의 2 문자열 세트(예: [0,1], [2,3], [4,5], [255, <null>) 각각에 대해 다음 단계를 수행한다.4. For each set of 2 strings from position 0 to the end of the input string (eg [0,1], [2,3], [4,5], [255, <null>), do the following steps:

Example:Example:

for (i=0; i<wcslen(inputString); i+=2) for (i=0; i<wcslen(inputString); i+=2)

Char1 = inputString[i]; Char1 = inputString[i];

Char2 = inputString[i+1]; Char2 = inputString[i+1];

a. Set an unsigned 4-byte integer value, dwNext, equal to the bitwise OR of Char2 shifted 16 bits to the high order and Char1.a. Set an unsigned 4-byte integer value, dwNext, equal to the bitwise OR of Char2 shifted 16 bits to the high order and Char1.

Example: dwNext = (Char2 << 16) | Char1;Example: dwNext = (Char2 << 16) | Char1;

b. Set dwHash equal to the exclusive OR between dwHash and dwNext.b. Set dwHash equal to the exclusive OR between dwHash and dwNext.

Example: dwHash = dwHash ^ dwNext;Example: dwHash = dwHash ^ dwNext;

5. 알고리즘의 결과는 dwHash 값이다.5. The result of the algorithm is the dwHash value.

2.4.2 Hyperlink Hash2.4.2 Hyperlink Hash

두 개의 null-terminated 유니코드 하이퍼링크 문자열인 hlink1(하이퍼링크 대상)과 hlink2(하이퍼링크 위치)가 주어지면 다음 알고리즘을 수행하여 부호 없는 4바이트 정수 해시를 얻을 수 있다.Given two null-terminated Unicode hyperlink strings, hlink1 (hyperlink target) and hlink2 (hyperlink location), we can perform the following algorithm to obtain an unsigned 4-byte integer hash:

1. Unicode String to Unsigned Interger(LONG) Hash(섹션 2.4.1)에 지정된 대로 hhlink1을 해시하고, 그 결과 부호없는 4바이트 정수 해시를 dwHash1에 저장한다.1. Hash hhlink1 as specified in Unicode String to Unsigned Interger (LONG) Hash (Section 2.4.1), and store the resulting unsigned 4-byte integer hash in dwHash1.

2. Unicode String to Unsigned Interger Hash(섹션 2.4.1)에 지정된 대로 hhlink2를 해시하고, 그 결과 부호없는 4바이트 정수 해시를 dwHash2로 저장한다.2. Hash hhlink2 as specified in Unicode String to Unsigned Interger Hash (Section 2.4.1), and store the resulting unsigned 4-byte integer hash as dwHash2.

3. 알고리즘의 결과는 dwHash1과 dwHash2의 exclusive OR 로 얻은 값이다.3. The result of the algorithm is the value obtained by exclusive OR of dwHash1 and dwHash2.

예: dwHash = dwHash1 ^ dwHash2;Example: dwHash = dwHash1 ^ dwHash2;

전술한 본 명세서는, 프로그램이 기록된 매체에 컴퓨터가 읽을 수 있는 코드로서 구현하는 것이 가능하다. 컴퓨터가 읽을 수 있는 매체는, 컴퓨터 시스템에 의하여 읽혀 질 수 있는 데이터가 저장되는 모든 종류의 기록장치를 포함한다. 컴퓨터가 읽을 수 있는 매체의 예로는, HDD(Hard Disk Drive), SSD(Solid State Disk), SDD(Silicon Disk Drive), ROM, RAM, CD-ROM, 자기 테이프, 플로피 디스크, 광 데이터 저장 장치 등이 있으며, 또한 캐리어 웨이브(예를 들어, 인터넷을 통한 전송)의 형태로 구현되는 것도 포함한다. 따라서, 상기의 상세한 설명은 모든 면에서 제한적으로 해석되어서는 아니되고 예시적인 것으로 고려되어야 한다. 본 명세서의 범위는 첨부된 청구항의 합리적 해석에 의해 결정되어야 하고, 본 명세서의 등가적 범위 내에서의 모든 변경은 본 명세서의 범위에 포함된다.The above specification can be implemented as computer readable code on a medium on which a program is recorded. A computer-readable medium includes all types of recording devices in which data that can be read by a computer system is stored. Examples of computer-readable media include Hard Disk Drive (HDD), Solid State Disk (SSD), Silicon Disk Drive (SDD), ROM, RAM, CD-ROM, magnetic tape, floppy disk, optical data storage device, etc. , and also includes those implemented in the form of a carrier wave (eg, transmission over the Internet). Accordingly, the above detailed description should not be construed as limiting in all respects and should be considered illustrative. The scope of this specification should be determined by reasonable interpretation of the appended claims, and all changes within the equivalent scope of this specification are included in the scope of this specification.

또한, 이상에서 서비스 및 실시 예들을 중심으로 설명하였으나 이는 단지 예시일 뿐 본 명세서를 한정하는 것이 아니며, 본 명세서가 속하는 분야의 통상의 지식을 가진 자라면 본 서비스 및 실시 예의 본질적인 특성을 벗어나지 않는 범위에서 이상에 예시되지 않은 여러 가지의 변형과 응용이 가능함을 알 수 있을 것이다. 예를 들어, 실시 예들에 구체적으로 나타난 각 구성 요소는 변형하여 실시할 수 있는 것이다. 그리고 이러한 변형과 응용에 관계된 차이점들은 첨부한 청구 범위에서 규정하는 본 명세서의 범위에 포함되는 것으로 해석되어야 할 것이다.In addition, although services and embodiments have been described above, this is only an example and does not limit the present specification, and those skilled in the art to which this specification belongs will not deviate from the essential characteristics of the present service and embodiments. It will be seen that various modifications and applications not exemplified above are possible. For example, each component specifically shown in the embodiments can be modified and implemented. And differences related to these modifications and applications should be construed as being included in the scope of the present specification as defined in the appended claims.

Claims (8)

서버가 DocumentSummaryInformation 스트림의 링크정보를 무해화(Disarming) 시키는 방법에 있어서,
상기 DocumentSummaryInformation 스트림에서 PropertySetStream 레코드를 확인하는 단계;
상기 PropertySetStream 레코드의 NumPropertySets의 필드값을 확인하는 단계;
상기 NumPropertySets의 필드값이 2를 나타내는 것에 근거하여, FMTID0 및 FMTID1의 필드값이 정당한지 판단하는 단계;
상기 FMTID0 및 상기 FMTID1의 필드값이 정당한 것에 근거하여, VtHyperlinks 레코드를 확인하는 단계; 및
상기 VtHyperlinks 레코드에 근거하여, 상기 링크정보를 무해화하는 단계;
를 포함하며,
상기 FMTID0 및 상기 FMTID1의 필드값이 정당한지 판단하는 단계는
상기 FMTID0 필드값은 D5CDD502-2E9C-101B-9397-08002B2CF9AE 값이고,
상기 FMTID1 필드값은 D5CDD505-2E9C-101B-9397-08002B2CF9AE 값인 것에 근거하는, 무해화 방법.
In the method for the server to disarm the link information of the DocumentSummaryInformation stream,
Checking a PropertySetStream record in the DocumentSummaryInformation stream;
checking field values of NumPropertySets of the PropertySetStream record;
determining whether the field values of FMTID0 and FMTID1 are valid based on the fact that the field value of the NumPropertySets indicates 2;
verifying a VtHyperlinks record based on valid field values of the FMTID0 and the FMTID1; and
disarming the link information based on the VtHyperlinks record;
Including,
The step of determining whether the field values of the FMTID0 and the FMTID1 are valid
The FMTID0 field value is a D5CDD502-2E9C-101B-9397-08002B2CF9AE value,
The FMTID1 field value is based on the D5CDD505-2E9C-101B-9397-08002B2CF9AE value.
삭제delete 제1항에 있어서,
상기 VtHyperlinks 레코드를 확인하는 단계는
CodePage Property에서 Dictionary Property와 관련된 인코딩 정보를 확인하는 단계; 및
상기 인코딩 정보에 근거하여, 상기 Dictionary Property에서 문자열 “_PID_HLINKS”를 확인하는 단계;
를 포함하는, 무해화 방법.
According to claim 1,
Checking the VtHyperlinks record
Checking encoding information related to Dictionary Property in CodePage Property; and
Based on the encoding information, checking the character string “_PID_HLINKS” in the Dictionary Property;
Including, detoxification method.
제3항에 있어서,
상기 “_PID_HLINKS”의 확인에 근거하여, 상기 VtHyperlinks 레코드는 TypedPropertyValue에 포함되는, 무해화 방법.
According to claim 3,
Based on the confirmation of the "_PID_HLINKS", the VtHyperlinks record is included in the TypedPropertyValue.
제4항에 있어서,
상기 링크정보를 무해화하는 단계는
상기 VtHyperlinks 레코드의 vtValue 필드를 통해, VtHyperlinkValue 레코드를 확인하는 단계;
상기 VtHyperlinkValue 레코드의 vecHyperlink의 rgHyperlink 필드를 통해, VtHyperlink의 배열을 확인하는 단계; 및
상기 VtHyperlink 레코드의 hlink1 및 hlink2 필드에 대해 무해화하는 단계;
를 포함하는, 무해화 방법.
According to claim 4,
The step of detoxifying the link information is
checking a VtHyperlinkValue record through a vtValue field of the VtHyperlinks record;
checking an array of VtHyperlinks through an rgHyperlink field of vecHyperlink of the VtHyperlinkValue record; and
disarming the hlink1 and hlink2 fields of the VtHyperlink record;
Including, detoxification method.
제5항에 있어서,
상기 hlink1 및 hlink2 필드에 대해 무해화하는 단계는
상기 hlink1 및 hlink2 필드에서 scheme만 남기는 단계;
를 포함하는, 무해화 방법.
According to claim 5,
The step of detoxifying the hlink1 and hlink2 fields
leaving only schemes in the hlink1 and hlink2 fields;
Including, detoxification method.
제1항에 있어서,
무해화된 상기 링크정보에 근거하여, dwHash 필드를 수정하는 단계;
를 포함하는, 무해화 방법.
According to claim 1,
Modifying a dwHash field based on the harmless link information;
Including, detoxification method.
DocumentSummaryInformation 스트림의 링크정보를 무해화(Disarming) 시키는 서버에 있어서,
통신부;
메모리; 및
상기 통신부 및 상기 메모리를 기능적으로 제어하는 프로세서;를 포함하고,
상기 프로세서는
상기 DocumentSummaryInformation 스트림에서 PropertySetStream 레코드를 확인하고, 상기 PropertySetStream 레코드의 NumPropertySets의 필드값을 확인하며, 상기 NumPropertySets의 필드값이 2를 나타내는 것에 근거하여, FMTID0 및 FMTID1의 필드값이 정당한지 판단하고, 상기 FMTID0 및 상기 FMTID1의 필드값이 정당한 것에 근거하여, VtHyperlinks 레코드를 확인하고, 상기 VtHyperlinks 레코드에 근거하여, 상기 링크정보를 무해화하며, 상기 FMTID0 및 상기 FMTID1의 필드값이 정당한지 판단하기 위해, 상기 FMTID0 필드값은 D5CDD502-2E9C-101B-9397-08002B2CF9AE 값이고, 상기 FMTID1 필드값은 D5CDD505-2E9C-101B-9397-08002B2CF9AE 값인 것에 근거하는, 서버.
In a server that disarms link information of a DocumentSummaryInformation stream,
communications department;
Memory; and
A processor functionally controlling the communication unit and the memory;
The processor
The PropertySetStream record is checked in the DocumentSummaryInformation stream, the field value of NumPropertySets of the PropertySetStream record is checked, and based on the fact that the field value of the NumPropertySets indicates 2, it is determined whether the field values of FMTID0 and FMTID1 are valid, and the FMTID0 and The FMTID0 field to check the VtHyperlinks record based on whether the field value of the FMTID1 is valid, to harmonize the link information based on the VtHyperlinks record, and to determine whether the field values of the FMTID0 and the FMTID1 are valid. the value is the D5CDD502-2E9C-101B-9397-08002B2CF9AE value, and the FMTID1 field value is the D5CDD505-2E9C-101B-9397-08002B2CF9AE value.
KR1020220135068A 2022-10-19 2022-10-19 Methods and apparatus for disarming a link on documentsummaryinformation stream in ms-cfb KR102494838B1 (en)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020220135068A KR102494838B1 (en) 2022-10-19 2022-10-19 Methods and apparatus for disarming a link on documentsummaryinformation stream in ms-cfb

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020220135068A KR102494838B1 (en) 2022-10-19 2022-10-19 Methods and apparatus for disarming a link on documentsummaryinformation stream in ms-cfb

Publications (1)

Publication Number Publication Date
KR102494838B1 true KR102494838B1 (en) 2023-02-06

Family

ID=85224135

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020220135068A KR102494838B1 (en) 2022-10-19 2022-10-19 Methods and apparatus for disarming a link on documentsummaryinformation stream in ms-cfb

Country Status (1)

Country Link
KR (1) KR102494838B1 (en)

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101860546B1 (en) * 2017-04-28 2018-05-23 (주)지란지교시큐리티 Apparatus and method for disarm of contents included in file, recording medium thereof

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101860546B1 (en) * 2017-04-28 2018-05-23 (주)지란지교시큐리티 Apparatus and method for disarm of contents included in file, recording medium thereof

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Forensecurity, "Microsoft Office Compound Document Internals Part 4 - SummaryInformation"(2014.01.)* *
Kamran Saifullah, "Analyzing Malicious Word Documents"(2022.03.)* *

Similar Documents

Publication Publication Date Title
US10902111B2 (en) Methods, media, and systems for detecting attack on a digital processing device
Halfond et al. Preventing SQL injection attacks using AMNESIA
Carmony et al. Extract Me If You Can: Abusing PDF Parsers in Malware Detectors.
US8051486B2 (en) Indicating SQL injection attack vulnerability with a stored value
US9690935B2 (en) Identification of obfuscated computer items using visual algorithms
US20080027866A1 (en) System and method for authenticating file content
US8484232B2 (en) Method, computer arrangement, computer program and computer program product for checking for the presence of control statements in a data value
US9519780B1 (en) Systems and methods for identifying malware
KR102583399B1 (en) Methods and apparatus for disarming a link in pdf
KR102468431B1 (en) Method and apparatus for disarming ole object in ms-ooxml
Otsubo et al. O-checker: Detection of malicious documents through deviation from file format specifications
KR102494838B1 (en) Methods and apparatus for disarming a link on documentsummaryinformation stream in ms-cfb
KR102488943B1 (en) Methods and apparatus for disarming a link in ms-ppt
KR102494836B1 (en) Methods and apparatus for disarming a link in ms-doc
KR102538664B1 (en) Methods and apparatus for the disarming of link in the formula function in excel document
Falah et al. Towards enhanced PDF maldocs detection with feature engineering: design challenges
KR102548779B1 (en) Methods and apparatus for extracting and inspecting document files inserted into documents in ms-cfb format
KR102468434B1 (en) Method and apparatus for disarming dde in ms excel document format
KR102468428B1 (en) Method and device for disarming of JavaScript in PDF or HWP
KR102494827B1 (en) Methods and apparatus for detecting malicious macros in non-executable files using ocr
KR102549007B1 (en) Methods and apparatus for detecting macro using debugging engine
KR102548984B1 (en) Methods and apparatus for detecting malicious document files using artificial intelligence models
Gundoor Identification Of Dominant Features in Non-Portable Executable Malicious File
Bradley et al. Bulk extractor 1.4 user’s manual
Tryonermoefthefollowing Microsoft Wrd

Legal Events

Date Code Title Description
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant