Verbesserte E-Mail-Sicherheit - Implikationen für den Entwickler

Veröffentlicht: 22. Jul 2004 | Aktualisiert: 06. Dez 2004

Diese Änderung ist für jeden Entwickler von Interesse, der aktuell einen E-Mail- oder Chat-Client schreibt oder plant, einen solchen Client zu schreiben.

Beschreibung

Der Attachment Execute Service (Anhangausführungsdienst) basiert auf einem Rahmen der Vertrauenswürdigkeit zur Ausführung von Dateien. Bei der Verwendung von Attachment Execution Services brauchen Anwendungen bei der Ausführung von Anhängen keine Vertrauensentscheidungen zu treffen. Vielmehr treffen in diesem Fall die Attachment Execution Services die Vertrauensentscheidungen basierend auf der Konfiguration und den Fähigkeiten des Computers. Den Benutzern werden Nachrichten mit umfassenden Informationen bereitgestellt, sodass sie informierte Entscheidungen über das Öffnen oder Nicht-Öffnen bestimmter Dateien treffen können. Die Nachrichten enthalten Informationen über den Handler, der verwendet wird, um den Anhang zu verarbeiten, sowie weitere Informationen über die Dateiquelle. Intern teilen die Attachment Execution Services jedem Anhang eine Risikoeinstufung zu, basierend auf der Dateierweiterung, dem Inhaltstyp, den registrierten Handlern und anderen Heuristiken. Diese Risikoeinstufung wird dann in eine Richtlinie abgebildet, die mit den bekannten IE-Zonen (eingeschränkt, Internet, Intranet, lokal und vertrauenswürdig) überprüft wird. Dieser Dienst stellt keine Behelfslösung bereit, um den Entscheidungsrahmen zu umgehen. Hierbei kann zwar eine gewisse Funktionalität verloren gehen, doch dies ist ein akzeptabler Verlust, wenn man sich die Alternative vor Augen hält.

Der programmatische Einstiegspunkt der Attachment Execution Services ist die Schnittstelle IAttachmentExecute, die vier neue API-Aufrufe enthält:

CheckPolicy()

Ersetzt die Clientinterpretation von AssocIsDangerous() und die benutzerdefinierte Richtlinie/Konfiguration. Untersucht verfügbare Sicherheitsbeweise und überprüft die resultierende Richtlinie.

PromptUser()

Ersetzt benutzerdefinierte Eingabeaufforderungen für das Benutzervertrauen. Kann von der Anwendung aufgerufen werden, um die Benutzeroberfläche (UI) zu einem früheren Zeitpunkt anzuzeigen, selbst bevor die Datei auf die Platte kopiert wird.

Execute

Ersetzt den Aufruf von ShellExecute(). Stellt sicher, dass CheckPolicy() und PromptUser() bei Bedarf aufgerufen werden. Ruft IAttachmentExecute::PromptUser() mit einer EXEC-Aktion auf.

Save()

Stellt sicher, dass CheckPolicy() bei Bedarf aufgerufen wird. Speichert Sicherheitsbeweise für den Anhang.

Anwendungen sollten IAttachmentExecute::CheckPolicy aufrufen, um die Ausführungsrichtlinien für einen bestimmte Anhang festzulegen. IAttachmentExecute::CheckPolicy untersucht den Sicherheitsbeweis, der eine Reihe von Eigenschaften umfasst, die mit folgenden Methoden gesetzt werden können:

Der Aufruf von IAttachmentExecute::CheckPolicy ermöglicht es einer Anwendung, ihre Benutzeroberfläche (UI) abhängig vom Ergebnis des Aufrufs zu verändern.

IAttachmentExecute::CheckPolicy setzt voraus, dass die Anwendung zunächst IAttachmentExecute::SetFileName oder IAttachmentExecute::SetLocalPath aufruft. Bei einem einfachen Aufruf von IAttachmentExecute::Save oder IAttachmentExecute:Execute wird die Richtlinie jedoch überprüft und der Benutzer erhält bei Bedarf eine Eingabeaufforderung. Der für den Anhang gesammelte Sicherheitsbeweis wird zusammen mit dem Anhang gespeichert, sodass die Beschränkungen bei einer Ausführung zu einem späteren Zeitpunkt eingehalten werden können.

Im Folgenden finden Sie ein Beispiel dafür, wie ein in C++ geschriebener E-Mail-Client IAttachmentExecute verwenden könnte.

// Von Client definierte CClientAttachmentInfo  
// implementiert die erforderliche Clientfunktionalität über Anhänge 
class CClientAttachmentInfo;   
 
HRESULT CreateAttachmentServices(IAttachmentExecute **ppae) 
{ 
  //  Annahme, dass CoInitialize() bereits für diesen Thread aufgerufen wurde 
  HRESULT hr = CoCreateInstance(CLSID_AttachmentServices,  
                           NULL,  
                           CLSCTX_INPROC_SERVER,  
                           IID_IAttachmentExecute,  
                           (void**)&pAttachExec); 
 
  if (SUCCEEDED(hr)) 
  { 
    //Client-Titel und GUID für UI-Aufforderung setzen 
 
    //  UUID_ClientID sollte mit uuidgen.exe erstellt und intern definiert werden 
    (*ppae)-&>SetClientGuid(UUID_ClientID); 
    //  g_pszTitle mit optionalem Vorrang für Dialog-UI 
    //  (*ppae)-&>SetClientTitle(g_pszTitle); 
  } 
  return hr; 
} 
 
BOOL IsAttachmentBlocked(CClientAttachmentInfo *pinfo) 
{ 
  //  CopyAttachmentToTempFile() würde Datei aus E-Mail-Speicher in Temp-Datei kopieren 
  PWSTR pszFileName; 
  HRESULT hr = pinfo-&>GetFileName(&pszFileName); 
  if (SUCCEEDED(hr)) 
  { 
    IAttachmentExecute *pExecute; 
    hr = CreateAttachmentServices(&pExecute); 
    if (SUCCEEDED(hr)) 
    { 
      hr = pExecute-&>SetFileName(pszFileName); 
      //  SetLocalPath() nicht aufrufen, da lokaler Pfad noch nicht verfügbar ist 
      //  SetSource() nicht aufrufen, da E-Mail-Quellen nicht überprüfbar sind 
     //  SetReferrer() nicht aufrufen, da keine bessere Zone als Standardzone (eingeschränkt) verfügbar ist 
     if (SUCCEEDED(hr)) 
     { 
       hr = pExecute-&>CheckPolicy(); 
     } 
     pExecute-&>Release(); 
    } 
    LocalFree(pszFileName); 
  } 
  return FAILED(hr); 
} 
  
HRESULT OnDoubleClickAttachment(HWND hwnd, CClientAttachmentInfo *pinfo) 
{ 
  //  CopyAttachmentToTempFile() würde Datei aus E-Mail-Speicher in Temp-Datei kopieren 
  PWSTR pszTempFile; 
  HRESULT hr = pinfo-&>CopyToTempFile(&pszTempFile); 
  if (SUCCEEDED(hr)) 
  { 
    IAttachmentExecute *pExecute; 
    hr = CreateAttachmentServices(&pExecute); 
    if (SUCCEEDED(hr)) 
    { 
      hr = pExecute-&>SetLocalPath(pszTempFile); 
      //  SetFileName() nicht aufrufen, da lokaler Pfad verfügbar ist 
     //  SetSource() nicht aufrufen, da E-Mail-Quellen nicht überprüfbar sind 
     //  SetReferrer() nicht aufrufen, da keine bessere Zone als Standardzone (eingeschränkt) verfügbar ist 
     if (SUCCEEDED(hr)) 
     { 
       hr = pExecute-&>Execute(hwnd, NULL, NULL); 
     } 
     pExecute-&>Release(); 
    } 
    LocalFree(pszTempFile); 
  } 
  return hr; 
} 
 
HRESULT OnSaveAttachment(HWND hwnd, CClientAttachmentInfo *pinfo) 
{ 
  //  CopyAttachmentToTempFile() würde Datei aus E-Mail-Speicher  
  //  in eine vom Benutzer gewählte Temp-Datei kopieren 
  PWSTR pszUserFile; 
  HRESULT hr = pinfo-&>CopyToUserFile(hwnd, &pszUserFile); 
  if (SUCCEEDED(hr)) 
  { 
    IAttachmentExecute *pExecute; 
    hr = CreateAttachmentServices(&pExecute); 
    if (SUCCEEDED(hr)) 
    { 
      hr = pExecute-&>SetLocalPath(pszTempFile); 
      //  SetFileName() nicht aufrufen, da lokaler Pfad verfügbar ist 
      //  SetSource() nicht aufrufen, da E-Mail-Quellen nicht überprüfbar sind 
      //  SetReferrer() nicht aufrufen, da keine bessere Zone als Standardzone (eingeschränkt) verfügbar ist 
      if (SUCCEEDED(hr)) 
      { 
        hr = pExecute-&>Save(); 
      } 
      pExecute-&>Release(); 
    } 
    LocalFree(pszUserFile); 
  } 
  return hr; 
}

Weitere Informationen zu den IAttachmentExecute-Funktionen finden Sie unter: https://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/ifaces/iattachmentexecute/iattachmentexecute.asp.

Erforderliche Aktion

Die Verwendung von IAttachmentExecute (und Attachment Execution Services) folgt vom Empfang bis zum Öffnen bzw. Verwerfen eines Anhangs einem bestimmten Pfad.

Im einfachsten Szenario, in dem ein Anhang auf einer Festplatte eines Benutzers gespeichert wird, müssen hierbei Aufrufe von benutzerdefiniertem Code zur Überprüfung von Dateitypen (oder Aurufe von AssocIsDangerous) sowie die benutzerdefinierte Benutzeroberfläche, mit der der Benutzer zu einer Eingabe aufgefordert wird, mit einem einzigen Aufruf ersetzt werden. Die Methode IAttachmentExecute::Save ruft die Methoden CheckPolicy und PromptUser bei Bedarf auf und speichert außerdem die gesammelten Sicherheitsbeweise im Anhang, sodass der Anhang sicher geöffnet wird und zu einem späteren Zeitpunkt Zonenbeschränkungen erzwungen werden können.

pfeilrechts.gif Einführung
pfeilrechts.gif Erhöhter Netzwerkschutz
pfeilrechts.gif Neuer Speicherschutz
pfeilrechts.gif Verbesserte E-Mail-Sicherheit
pfeilrechts.gif Erweiterte Sicherheit beim Browsen
pfeilrechts.gif Zusammenfassung