
Intel Management Engine JTAG Proof of Concept - 2022 Anleitung
Alle Informationen dienen ausschließlich Bildungszwecken. Befolgen Sie diese Anweisungen auf eigenes Risiko. Weder die Autoren noch ihr Arbeitgeber übernehmen Verantwortung für direkte oder Folgeschäden oder Verluste, die aus Handlungen oder Unterlassungen von Personen oder Organisationen auf der Grundlage der auf dieser Seite enthaltenen Informationen entstehen.
Einführung
Erforderliche Software
Erzeugen der Payload
Erzeugen des Unlock-Tokens
Vorbereiten des SPI-Flash-Images
Integrieren von Dateien in das Firmware-Image
Deaktivieren der OEM-Signierung
Erstellen des Firmware-Images
BringUP der Haupt-CPU
Schreiben des Images auf den SPI-Flash
Vorbereiten des USB-Debug-Kabels
Patchen von OpenIPC-Konfigurationsdateien
Entschlüsseln von OpenIPC-Konfigurationsdateien
Hinzufügen des LMT-Cores zur Konfiguration
Festlegen der Umgebungsvariable IPC_PATH
Durchführen einer ersten Überprüfung der JTAG-Betriebsfähigkeit
CPU-ME-Thread anzeigen
Anhalten von Cores
ME-Debugging: Schnellstart
Lesen von beliebigem Speicher
ROM lesen
Warum TXE?
Liste der getesteten Plattformen
Autoren
Lizenz
Die Schwachstelle INTEL-SA-00086 ermöglicht die Aktivierung von JTAG für den Intel Management Engine-Kern. Wir haben unseren [JTAG-PoC][8] für die Plattform Gigabyte Brix GP-BPCE-3350C entwickelt. Obwohl wir angehenden Forschern empfehlen, dieselbe Plattform zu verwenden, sollten Plattformen anderer Hersteller mit dem Intel Apollo Lake-Chipsatz den PoC ebenfalls unterstützen (für TXE-Version 3.0.1.1107).
Da der Gigabyte Brix GP-BPCE-3350C nicht mehr breit im Handel erhältlich ist, wurden diese Anweisungen aktualisiert und zielen stattdessen auf das AAEON UP Squared SKU UPS-APLX7-A20-0864 (Intel Atom® x7-E3950). Wenn Sie dieses Board kaufen, besorgen Sie sich unbedingt auch das Netzteil, den Seriell-Adapter und einen beliebigen USB-zu-seriell-Adapter. Darüber hinaus benötigt das UP Squared nur ein einfaches USB-Debug-Kabel, um DCI-Debugging durchzuführen. Das USB-Debug-Kabel sollte an den Port angeschlossen werden, an dem das gelbe USB-Kabel hier gezeigt wird.
Die Schwachstelle INTEL-SA-00086 beinhaltet einen Pufferüberlauf bei der Verarbeitung einer Datei, die auf MFS (dem [internen ME-Dateisystem][6]) gespeichert ist. Der vollständige Dateipfad ist /home/bup/ct. Sie müssen eine Version dieser Datei, die die Schwachstelle ausnutzt, mithilfe des Intel Flash Image Tool (FIT) in die ME-Firmware integrieren – eines der Intel System Tools, die Intel OEMs von Hardware auf Basis von Intel-PCH-Chipsätzen bereitstellt.
Die Intel ME (TXE, SPS) System Tools-Dienstprogramme sind nicht für Endbenutzer bestimmt – daher finden Sie sie nicht auf der offiziellen Intel-Website. Einige OEMs veröffentlichen sie jedoch als Teil von Software-Updates zusammen mit Gerätetreibern. Für die Integration unseres PoC benötigen Sie also „CSTXE System Tools v3", das Sie hier finden.
Sie müssen Intel System Studio installieren, um JTAG-Debugging durchzuführen. In unseren ursprünglichen Experimenten haben wir Intel System Studio 2018 verwendet. Diese Anweisungen wurden für Intel System Studio 2020 aktualisiert, das Sie hier erhalten.
Der PoC zielt auf Intel TXE-Firmware-Version 3.0.1.1107. Das „CSTXE 3.0"-Image-Repository in den Win-Raid-Foren enthält die erforderliche TXE-Firmware-Version.
Alle unsere Skripte sind in Python geschrieben. Wir empfehlen die Verwendung von Python 2.7 Außerdem benötigen die Skripte das Paket pycrypto. Führen Sie zum Installieren von pycrypto den folgenden Befehl aus:``` pip install pycrypto
## Durchführen von Basis-x86-Debugging über DCI
Obwohl der Zweck dieses Handbuchs darin besteht, JTAG-Debugging im ME über einen Exploit zu ermöglichen, ist es eine gute Praxis, zunächst eine Plausibilitätsprüfung durchzuführen und sicherzustellen, dass Sie normales JTAG-Debugging des UP-Squared-Boards über DCI durchführen können. AAEON liefert seine BIOS-Versionen nicht mehr mit aktiviertem DCI aus, da sie in ihren Foren angaben, dass dies zu Instabilitäten führte. (Und ältere BIOS-Versionen vor v5.0, die DCI aktiviert hatten, funktionieren mit neuerer Hardware aufgrund einer Hardwareänderung des DRAM-Herstellers nicht mehr.) Um DCI-JTAG auf dem UP Squared zu aktivieren, müssen Sie daher 3 Schritte ausführen:
1) Führen Sie das von Satoshi Tanda [hier](https://forum.up-community.org/discussion/comment/12877#Comment_12877) beschriebene binäre Patchen durch (obwohl es heißen sollte, UEFITool 0.28 und nicht 2.8 zu verwenden).
2) Aktivieren Sie DCI über das BIOS-Konfigurationsmenü, indem Sie beim Booten F7 drücken, das Standard-UP-Passwort (*upassw0rd*) eingeben, vom Hauptmenü zu "CRB Setup" -> "CSB Chipset" -> "South Cluster Configuration" -> "Miscellaneous Configuration" -> "DCI Enable (HDCIEN)" navigieren und es auf aktiviert setzen. Verlassen Sie dann das BIOS-Setup-Menü, speichern Sie die Konfigurationsänderung und starten Sie das System neu.
3) Öffnen Sie "C:\IntelSWTools\system_studio_2020\system_debugger_2020\target_indicator\bin\TargetIndicator.exe" und bestätigen Sie, dass bei angeschlossenem System am UP Squared über das Debug-Kabel ein blauer Indikator angezeigt wird, der anzeigt, dass DCI möglich ist, wie unten gezeigt:

Sie können dann ":\Program Files (x86)\IntelSWTools\sw_dev_tools\system_debugger_2020\system_debug_legacy\xdb.bat" starten, sich mit dem Ziel verbinden, die Ausführung unterbrechen und einen Einzelschritt durchführen, um zu bestätigen, dass Sie über grundlegende Debugging-Fähigkeiten verfügen.
(Sie können auch der Blogserie von Alan Sguigna [hier](https://www.asset-intertech.com/resources/blog/2020/05/open-source-firmware-explorations-using-dci-on-the-aaeon-up-squared-board/) folgen, die beschreibt, wie man den Debug-Build des Open-Source-Codes für diese Plattform erstellt, der ab dem Reset-Vektor per DCI debugbar ist. Beachten Sie jedoch, dass dieser aus dem Quellcode erstellte Code aufgrund einer Hardwareänderung des DRAM nicht mehr vollständig auf neuer Hardware booten wird – er wird stattdessen beim Booten hängen bleiben, wie [hier](https://forum.up-community.org/discussion/comment/12877) vermerkt. Die Intel-TianoCore-Maintainer haben sich geweigert, dies zu beheben.)
# Erzeugen des Payloads
Führen Sie das Skript **me_exp_bxtp.py** aus:```
me_exp_bxtp.py -f <file_name>
Das Skript generiert die erforderlichen Daten und exportiert sie in die angegebene Datei (geben Sie entweder den vollständigen Dateipfad an oder, innerhalb des aktuellen Verzeichnisses, einfach einen Namen, standardmäßig ct.bin). Diese Datei wird später von FIT verwendet.
Führen Sie das Skript utock_gen.py aus:``` utock_gen.py -f <file_name>
Das Skript generiert die notwendigen Daten und exportiert sie in die angegebene Datei (entweder den vollständigen Dateipfad angeben oder, innerhalb des aktuellen Verzeichnisses, einfach einen Namen, standardmäßig *utok.bin*). Diese Datei wird später von *FIT* verwendet.
# Vorbereiten des SPI-Flash-Images
## Payload integrieren
Um die Dateien *ct.bin* und *utok.bin* zu integrieren, führen Sie das Dienstprogramm *FIT* (*fit.exe*) aus, das Sie aus *CSTXE System Tools v3* erhalten haben. Verwenden Sie es zuerst, um Ihr UP-Squared-BIOS-Image zu öffnen, für das DCI aktiviert wurde (z. B. "UPA1AM61_DCI_Enabled.bin").

*FIT* extrahiert beim Öffnen des Images verschiedene Abschnitte des gesamten SPI-Images (SPI-Descriptor, UEFI/BIOS-Firmware, Intel-ME-Firmware und Unlock-Token) und speichert sie im Ordner *"image_name"/Decomp* im selben lokalen Verzeichnis wie FIT.

Danach speichern Sie die Konfigurations-XML (z. B. unter "UPA1AM61_DCI_Enabled.xml") und beenden fit.exe.
Um die Intel-TXE-Firmware auf die anfällige Version **3.0.1.1107** herabzustufen, müssen wir die Datei <image name>/Decomp/TXE Region.bin durch die Datei "3.0.1.1107_B_PRD_RGN.bin" ersetzen. Dies sollte erfolgen, indem die Originaldatei in "TXE Region.bin.orig" umbenannt wird und anschließend "3.0.1.1107_B_PRD_RGN.bin" in "TXE Region.bin" umbenannt wird.
Öffnen Sie fit.exe erneut und laden Sie Ihre Konfiguration aus Ihrer gespeicherten XML-Datei. Wenn Sie die Datei im Dateisystem korrekt ersetzt haben, sollten Sie auf der Registerkarte "Flash Layout" im Feld "Intel(R) TXE Binary File" die Version 3.0.1.1107 sehen, anstatt der Version, die ursprünglich enthalten war:

# Integrieren der Exploit-Dateien in das Firmware-Image
Jetzt müssen wir in *FIT* die Dateien angeben, die wir für */home/bup/ct* (**ct.bin**) und *Unlock Token* (**utok.bin**) generiert haben. Auf der Registerkarte *Debug* in *FIT* können Sie das Trace Hub Binary und das Unlock-Token angeben, die in die Firmware integriert werden sollen. Dies sollten die Dateien sein, die wir bereits generiert haben.

# Deaktivieren der OEM-Signierung
Unter der Registerkarte "Platform Protection" befindet sich ein OEM Public-Key-Hash. Entfernen Sie diesen, indem Sie 32 Nullen eingeben:```
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Wählen Sie Build Settings

Standardmäßig sieht es wie folgt aus:

Aktualisieren Sie die Einstellungen, indem Sie den Namen von outimage.bin in den Namen Ihrer Eingabedatei ändern. Setzen Sie außerdem die Option "Enable Boot Guard warning message at build time" auf No,
und "Verify manifest signing keys against the OEM Key Manifest" auf No. Danach sollte es wie folgt aussehen:

Erstellen Sie das Image, indem Sie im Menü Build die Option Build Image auswählen.

Wenn bis zu diesem Punkt alles korrekt durchgeführt wurde, sollte der Build-Prozess erfolgreich sein und FIT gibt eine Konsolenmeldung wie die folgende aus:

Sie müssen den HAP-Modus aktivieren, damit dieser Exploit funktioniert. Bitindex 0 des Bytes am Offset +0x102 muss manuell per Hex-Editor in der von fit.exe erstellten Ausgabedatei auf 1 gesetzt werden:

Am Ende des Vorgangs sollten Sie eine Datei erhalten, die der hier bereitgestellten Beispieldatei ähnelt, wobei diese jedoch für die UP-BIOS-Version 5.2 gilt und die vorhergehenden Anweisungen für Version 6.1 gelten.
Zum Schreiben des Images auf den SPI-Flash empfehlen wir dringend einen SPI-Programmer (wie z. B. den Dediprog SF600Plus).
Sichern Sie unbedingt die Original-Firmware, damit Sie sie wiederherstellen können, falls etwas schiefgeht!
Sie benötigen ein USB-3.0-Debug-Kabel, um eine Verbindung zur Plattform herzustellen. Sie können entweder ein speziell für diesen Zweck angefertigtes kaufen oder sich aus einem USB-3.0-AM–AM-Kabel ein eigenes zusammenbauen, indem Sie die Kontakte D+, D- und Vcc isolieren.

Intel entwickelt und stellt Benutzern zwei Softwarepakete zur Verfügung, die für das JTAG-Debugging von Plattformen und der Haupt-CPU verwendet werden können: DAL (DFx Abstraction Layer) und OpenIPC. Sowohl DAL als auch OpenIPC sind Teil von Intel System Studio. Nach der Installation von Intel System Studio 2020 erscheint OpenIPC im folgenden Verzeichnis:
Windows``` C:\IntelSWTools\system_studio_2020\tools\OpenIPC_1.2035.4868.100
Die *OpenIPC*-Konfiguration ist verschlüsselt und unterstützt den TXE-Core nicht. Entschlüsseln Sie also die Konfiguration und fügen Sie eine TXE-Beschreibung hinzu.
## Entschlüsseln von OpenIPC-Konfigurationsdateien
Um die Konfigurationsdateien zu entschlüsseln, extrahieren Sie den Schlüssel aus der *StructuredData*-Bibliothek (*StructuredData_x64.dll*) in *OpenIPC/Bin* mithilfe des [IDA Pro](https://www.hex-rays.com/products/ida/support/download_freeware.shtml)-Skripts *openipc_key_extract.py*. Wenn das Skript nicht funktioniert, können Sie die Datei einfach in IDA Pro öffnen, nach der Zeichenfolge "Logging.xml" suchen und dann die 16 Bytes danach nach der nächsten Ausrichtung abrufen. (Dort gibt es 4 zusätzliche Bytes und dann 4 Nullen nach den 16 Bytes, die Sie benötigen.) Übergeben Sie den Schlüssel (in unserem Fall *F820AD4F6CC2E9EE050C43DEBF631F59*) mit dem Pfad zum OpenIPC-Verzeichnis an das Skript *config_decryptor.py*.```
config_decryptor.py –k F820AD4F6CC2E9EE050C43DEBF631F59 –p C:\IntelSWTools\system_studio_2020\tools\OpenIPC_1.2035.4868.100
Die mitgelieferte Version von OpenIPC enthält nicht die notwendigen Informationen über den TXE-Core. Daher müssen wir einen Patch (patch.diff) auf die entschlüsselten OpenIPC-Konfigurationsdateien anwenden. So geht's:``` patch -p2 < patch.diff
# Festlegen der Umgebungsvariable IPC_PATH
Nach der Entschlüsselung und dem Patchen setzen Sie die Umgebungsvariable *IPC_PATH* auf das neue *OpenIPC*-Verzeichnis, damit *ipccli* die modifizierte *OpenIPC*-Version verwendet. Zum Beispiel:
Windows```
set IPC_PATH=C:\IntelSWTools\system_studio_2020\tools\OpenIPC_1.2035.4868.100\Bin
Der Aktivator blockiert das weitere Laden, indem er den BUP-Prozess in einer Schleife hält, nachdem JTAG aktiviert wurde. Nach dem Start zeigt die Plattform keine Lebenszeichen (der Monitor schaltet sich nicht ein, Tastaturanzeigen leuchten nicht auf und kein BIOS-POST-Signalton ertönt). Sie müssen also per DCI-Debugging prüfen, ob die Plattform im BUP-Modul „hängengeblieben“ ist.
Wie DAL enthält auch die OpenIPC-Bibliothek eine Befehlszeilenschnittstelle (CLI), die in Python geschrieben und als Bibliothek für Python im Rahmen von Intel System Studio bereitgestellt wird und mit Hilfe von pip auf dem System installiert werden kann. Das Installationspaket für ipccli befindet sich unter folgendem Pfad: Windows``` C:\IntelSWTools\system_studio_2020\system_debugger_2020\debugger\ipccli\ipccli-1.2035.1920.100-py2.py3-none-any.whl
Um ipccli zu installieren, führen Sie den folgenden Konsolenbefehl aus:```
pip install ipccli-1.2035.1920.100-py2.py3-none-any.whl
Nach der Installation ist ipccli in der Laufzeitumgebung der entsprechenden Python-Version verfügbar (der Version, aus der pip aufgerufen wurde). Um mit OpenIPC zu beginnen, führen Sie die folgenden Befehle in der Python-Konsole von einer Administratoreingabeaufforderung aus:``` import ipccli ipc = ipccli.baseaccess()
Der Mechanismus zur Verbindung mit der Zielplattform über DCI startet und führt zu folgender Konsolenausgabe:

Wenn keine Verbindung hergestellt wird – zum Beispiel, wenn die Plattform nicht eingeschaltet oder nicht physisch über DCI verbunden ist – ähneln die Meldungen dem Folgenden:

Wenn die *DCI*-Verbindung erfolgreich ist, stellen Sie sicher, dass das *PERSONALITY*-Register des *DFX_AGGRAGATOR*-Geräts den Wert 3 hat.
Das *PERSONALITY*-Register hat einen *IR*-Code (*Instruction Register*) von *0x54*. Um es auszulesen, führen Sie die folgenden Befehle aus:```
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
So sollte das Ergebnis dieses Befehls aussehen:

Das Dienstprogramm ipccli wird mit einer recht ausführlichen HTML-Dokumentation geliefert, die sich in einem Ordner des Python-Pakets ipccli befindet:``` \Lib\site-packages\ipccli\html\Index.html
## CPU-ME-Thread anzeigen
Wenn die vorherigen Schritte korrekt ausgeführt wurden, ist der *TXE*-Kern über *CSE Tap* zugänglich, sobald eine Verbindung zur Plattform über *ipccli* hergestellt wird, und *ipccli* ermöglicht den Zugriff darauf über den folgenden *ipccli*-Pfad:```
ipc.devs.cse_c0.threads[0]
Aber da der PoC das Laden der Plattform blockiert, bis die Haupt-CPU initialisiert ist, sind ihre Kerne über JTAG nicht zugänglich und auf den ME-Kern kann über den folgenden Befehl zugegriffen werden:``` ipc.threads[0]
## Kerne anhalten
Um ME-Prozessorbefehle anzuhalten, führen Sie den folgenden Befehl aus:```
me = ipc.devs.cse_c0.threads[0]
me.halt()
Um CPU-Prozessorbefehle anzuhalten, führen Sie den folgenden Befehl aus:``` core = ipc.threads[0] core.halt()

Die Konsole zeigt die logische Adresse der Anweisung an, an der der Halt erfolgte.
## Beliebigen Speicher lesen
*OpenIPC* erlaubt das Lesen von Speicher nach dem Halt, zum Beispiel:```
ipc.threads[0].mem("0xf0080004P", 4)
Du kannst eine logische Adresse (sel:offset), eine lineare Adresse (L-Modifikator) oder eine physische Adresse (P-Modifikator) angeben.
Der ME-System-Agent (MISA) ermöglicht es, die anfängliche physische Adresse des ROM-Bereichs zu ermitteln, der den ME-Reset-Vektor enthält. Du kannst die ROM-Adresse über das Hunit ROM Memory Base (HROMMB)-Register am Offset 0xe20 MISA MMIO (0xf0000000P) abrufen:

ROM befindet sich immer von ROMBASE bis 0xffffffff Um das ROM in eine Datei zu kopieren, führe den folgenden Befehl aus:``` ipc.threads[0].memsave("", "0xfffe0000p", 0x20001)
Es ist wichtig, die Größe als *0x20001* anzugeben, nicht als *0x20000* (andernfalls bekommt *OpenIPC* Probleme, da der 64-Bit-Zugriff für den 32-Bit-ME-Kern nicht möglich ist). Das letzte Byte der Datei kann verworfen werden, da es nicht Teil des *ROM* ist.
# Warum TXE?
Die Plattform bietet mehr Möglichkeiten zum Debuggen ohne einen speziellen [Intel CCA-SVT](https://designintools.intel.com/Silicon_View_Technology_Closed_Chassis_Adapter_p/itpxdpsvt.htm)-Adapter und ermöglicht es, die frühesten Phasen des TXE-Kerns über ein gewöhnliches *USB-Debug-Kabel* zu debuggen.
## Zugehörige URLs:
[Intel ME: The Way of the Static Analysis][4]
[Intel DCI Secrets][5]
[Intel ME: Flash File System Explained][6]
[How to Hack a Turned-Off Computer or Running Unsigned Code in Intel Management Engine][7]
[Inside Intel Management Engine][8]
[Disabling Intel ME 11 via undocumented mode][9]
## Liste der getesteten Plattformen
* Gigabyte Mini-PC Barebone (BRIX) GB-BPCE-3350C (rev:1.1, 1.2)
* Beelink M1
* [MinisForum N33](https://github.com/HackingThings/MinisForum_N33_JTAG) Mini PC - 2021
* UP Squared Intel Atom® x7-E3950 [SKU UPS-APLX7-A20-0864](https://up-shop.org/up-squared-series.html) - 2022
* UP 4000 Intel Atom® x7-E3950 [SKU UP-APL03X7F-A10-0464](https://up-shop.org/up4000series.html) - 2022
# Autoren
Mark Ermolov ([@\_markel___][1])
Maxim Goryachy ([@h0t_max][2])
### README.md-Update für Intel System Studio 2020 und UP Squared-Hardware
Xeno Kovah ([@XenoKovah][10])
# Forschungsteam
Mark Ermolov ([@\_markel___][1])
Maxim Goryachy ([@h0t_max][2])
Dmitry Sklyarov ([@_Dmit][3])
# Lizenz
Copyright (c) 2018 Mark Ermolov, Maxim Goryachy bei Positive Technologies
Hiermit wird unentgeltlich jeder Person, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die „Software") erhält, die Erlaubnis erteilt, die Software uneingeschränkt zu nutzen, einschließlich und ohne Einschränkung der Rechte zur Verwendung, Vervielfältigung, Änderung, Zusammenführung, Veröffentlichung, Verbreitung, Unterlizenzierung und/oder zum Verkauf von Kopien der Software, und Personen, denen die Software zur Verfügung gestellt wird, dies zu gestatten, vorbehaltlich der folgenden Bedingungen: Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein.
DIE SOFTWARE WIRD „OHNE MÄNGELGEWÄHR" BEREITGESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER IMPLIZITE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTTAUGLICHKEIT, DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND DER NICHTVERLETZUNG VON RECHTEN DRITTER. IN KEINEM FALL SIND DIE AUTOREN ODER URHEBERRECHTSINHABER FÜR ANSPRÜCHE, SCHÄDEN ODER ANDERE HAFTUNGEN VERANTWORTLICH, SEI ES AUS VERTRAG, DELIKT ODER ANDERWEITIG, DIE SICH AUS, AUS ODER IM ZUSAMMENHANG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN GESCHÄFTEN MIT DER SOFTWARE ERGEBEN.
[1]: https://twitter.com/_markel___
[2]: https://twitter.com/h0t_max
[3]: https://twitter.com/_Dmit
[4]: https://www.troopers.de/troopers17/talks/772-intel-me-the-way-of-the-static-analysis/
[5]: http://conference.hitb.org/hitbsecconf2017ams/sessions/commsec-intel-dci-secrets/
[6]: https://www.blackhat.com/docs/eu-17/materials/eu-17-Sklyarov-Intel-ME-Flash-File-System-Explained-wp.pdf
[7]: https://www.blackhat.com/docs/eu-17/materials/eu-17-Goryachy-How-To-Hack-A-Turned-Off-Computer-Or-Running-Unsigned-Code-In-Intel-Management-Engine-wp.pdf
[8]: https://github.com/ptresearch/IntelME-JTAG
[9]: http://blog.ptsecurity.com/2017/08/disabling-intel-me.html
[10]: https://twitter.com/XenoKovah