Outlook Adaptive Cards

Bei meinen Recherchen zu Outlook Textmail und ActiveCard bin ich auf ein seltsames Verhalten von Outlook gestoßen. Wenn ich Outlook anweise alle Mails als "Text Only" anzuzeigen, kommen die Teams-Benachrichtigungen immer noch formatiert an und anscheinend gibt es sogar noch Aktivitäten beim öffnen, obwohl ich alle Makros deaktiviert habe. Ich war alarmiert und habe das genauer untersucht.

Die Mail im Posteingang

Ich habe hier eine Beispiel-Mail, die von Teams an mich gesendet wurde. Rot umrandet sehen sie schön, das Outlook die Mail angeblich in "Nur-Text" konvertiert hat. Nur dass die Mail gar nicht danach aussieht.

Die Mail ist definitiv eine HTML-Mail und noch irritierender finde ich den Text kurz darunter in blauer Farbe. Was will Outlook beim Anzeigen einer Mail denn nachladen? Wenn ich die Mail öffne. dann sehe ich sogar kurz einen Fortschrittsanzeiger.

Outlook versucht da etwas, was ich später noch mit Fiddler genauer untersuche.

Als Nebeneffekt konnte ich auch den Text in der Mail z.B. nicht markieren und kopieren. Die Mail war irgendwie "geschützt"

MulitPart-Mail

Zuerst habe ich mir Zugriff auf die Raw-Mail beschafft. Da eingehende Mails über meinen NoSpamProxy laufen und dort für Debugging alle Mails zwischengepuffert werden, konnte ich schnell die Text-Datei extrahieren und mir den Body anschauen. Die Mail ist eine klassische "Multipart"-Mail aus mehreren Bausteinen, die aber nur einer einem HTML-Body und einigen Bildern besteht. Den Payload habe ich entfernt und sie sehen, dass der Body "base64 codiert" ist.

Content-Type: multipart/related; type="text/html";
boundary=--boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: <6805941354694C67A24CC96F54C68A7D>

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-ID: <08C38D03FDBF48779C31FA928A483C83>

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-ID: <4D36E969457C46F2B3F8428422F1A433>

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-ID: <6BABEEC45045428FBAC5757F45B3CB18>

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-ID: <actionable_logo>

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-ID: <actionable_apple>

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-ID: <actionable_android>

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-ID: <actionable_microsoft_logo>

----boundary_1063204_94dc85d9-b684-4e8d-bf8e-aed9b4b914ae--

Interessant ist aber, dass dieser Absender nur eine HTML-Version mitliefert aber keine "Text-Only Version"

HTML-Mail deoded

Also habe ich den BASE64 codierten Abschnitt mal schnell decodiert. Sie können das per PowerShell selbst machen oder einen Editor wie Notepad++ oder auch Fiddler nutzen. Zum Vorschein kam eine normale HTML-Datei, die aber am Ende einen interessanten Anhang hatte. Der war natürlich länger aber war wieder Base64 codiert.:

<section itemscope="" itemtype="http://schema.org/SignedAdaptiveCard">
    <meta itemprop="@context" content="http://schema.org/extensions">
    <meta itemprop="@type" content="SignedAdaptiveCard">
    <div itemprop="signedAdaptiveCard" style="mso-hide:all;display:none;max-height:0px;overflow:hidden;">
       xxxxxxxxxxx
    </div>
</section>

Der Begriff "SignedAdaptiveCard" liefert nur wenige Hinweise bei Google. Der einzig interessante Links war folgender

Aktion decodiert

Anscheinend ist die Aktion digital signiert. Aber zuerst schicke ich die auch noch mal durch den BASE64 Decoder und es hat mich nicht verwundert, wenn eine JSON-Struktur zum Vorschein gekommen ist. Hier ein paar Auszüge. Zuerst konnte ich Daten zur Mail erkennen.

{"alg":"RS256","typ":"JWT"}.{
   "sender":"noreply@email.teams.microsoft.com",
   "originator":"xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
   "recipientsSerialized":"[\"user1@msxfaq.de\"]",
   "adaptiveCardSerialized":"{
      \"type\":\"AdaptiveCard\",
      \"hideOriginalBody\":true,
      \"rtl\":false,\"version\":\"1.0\",
      \"padding\":\"none\",
      \"theme\":\"msteams\",
      \"body\":[{
         \"text\":\"Loading the latest messages. If you don't see them in 5 seconds, click on **Go to conversation** to view in Teams.\",
         \"wrap\":true,
         \"type\":\"TextBlock\"
         },
         {\"type\":\"Container\",
         \"style\":\"teamsHeader\",
         \"items\":[{
            \"type\":\"ColumnSet\",
            \"columns\":[{
               \"type\":\"Column\",
               \"width\":\"stretch\",
               \"items\":[{\"type\":\"TextBlock\",
                  \"color\":\"white\",\"size\":\"large\"
                  \"weight\":\"bolder\"
                  \"text\":\"Microsoft Teams\"
               }]

Im Mittelteil scheint es dann weitere Text-Abschnitte zu geben, die sich dann auf die Bilder der Mail beziehen:

\"items\":[{
   \"type\":\"Image\"
   \"size\":\"small\"
   \"url\":\"cid:actionable_logo\"}]

Auch einen größeren Textblock kann ich problemlos erkennen

\"text\":\"Hi Frank\"
{\"id\":\"summaryLink\"
\"text\":\"Your teammates are trying to reach you in [Microsoft Teams](https://teams.microsoft.com/l/message/19:xxxxx@thread.skype/xxx?tenantId=xxxxxxxx-xxxx-xxxx-xxxx-xxxx)\"
\"wrap\":true
\"type\":\"TextBlock\"}

Interessant finde ich aber dann diesen Block, in dem ich natürlich einige parameter gekürzt habe.

\"autoInvokeAction\":{
   \"id\":\"auto-invoke-action\"
   \"method\":\"POST\"
   \"url\":\"https://teams.microsoft.com/api/mt/amer/beta/actionableMessage/activity/init\"
   \"body\":\"{\\\"locale\\\":\\\"en-us\\\"
   \\\"activities\\\":[{\\\"type\\\":\\\"Mention\\\"
   \\\"subtype\\\":\\\"Channel\\\"
   \\\"messageId\\\":1583401548016
   \\\"sourceThreadId\\\":\\\"19:xxxxxxxxxx@thread.skype\\\"
   \\\"targetThreadId\\\":\\\"19:xxxxxxxxxx@thread.skype\\\"
   \\\"targetName\\\":\\\"Demo Channel\\\"}]}\"
   \"type\":\"Action.Http\"
   }
\"autoInvokeOptions\":{\"showCardOnFailure\":true}}"

Ich gehe davon aus, dass Outlook diese URL aufruf und die Parameter übergibt um aktuellere Informationen zu den Vorgang zu erhalten. Das klingt interessant und schreit nach einem Blick mit Fiddler in die Kommunikation:

Fiddler Trace

Jedes mal, wenn ich so eine Mail geöffnet haben, konnte Fiddler zwei Einträge loggen, die aber beide nicht zu teams.microsoft.com gehen sondern zum Exchange Postfach-Server in Exchange Online.

Wenn ich mir den zweiten Event aber genauer anschauen, dann sieht das eher nach Telemetrie aus, in der dem Backend verraten wird, das ich die Mail gelesen habe. Die HTTP-Antwort ist zwar ein 200OK aber die JSON-Antwort meldet einen 403.

Aber noch keine Spur von einem Zugriff auf die Teams-URL.

Zwischenstand

Bislang habe ich noch keine Sicherheitslücke gefunden bis auf das besondere Verhalten, dass Outlook mir weder die HTML-Version der Mail noch die "Text konvertierte" Version anzeigt sondern anscheinend die Actioncard-Version. Das eröffnet natürlich neue Angriffsmuster für Viren und Spammer, die vielleicht in diesem Payload ihre Informationen anzeigen. Dann hilft auch eine "Nur Text anzeigen"-Einstellung nicht, insbesondere wenn die Mail selbst gar keine Text-Version mehr mitliefert.

Damit Outlook diese Mails aber verarbeitet müssen Voraussetzungen erfüllt sein.

  • Die Domäne des Absenders muss verifizierbar sein.
    Das erfolgt per DKIM und SPF oder der Absender könnte die Karte digital signieren. Zumindest DKIM uns SPF sind für Spammer kein Problem.
  • ActionURL muss HTTPS machen
    Das ist für gute Absender aber auch für Spammer kein Problem mehr.
  • Service bei Microsoft anmelden
    Zuletzt muss der Anbieter seinen PublicKey im Developer Dashboard hinterlegen und Microsoft die Nutzung freigeben

Der letzte Punkt ist zwar keine unüberwindbare Hürde aber wenn Microsoft hier nicht schludert, dürfte es recht schwer für einen Angreifer werden. Diese Verhalten könnte auch der Grund für die beiden Anfragen sein, die ich im Fiddler gesehen habe. Vielleicht hat das Teams Team einfach seine Applikation noch nicht fertig und freigegeben. Outlook fragt vielleicht einfach danach und bekommt kein OK.

Es funktioniert übrigens nicht, die HTML-Datei in einem Browser zu öffnen

Ich werde die Vorgänge weiter beobachten.

Weitere Links