{"id":552,"date":"2009-12-08T20:08:37","date_gmt":"2009-12-08T19:08:37","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=552"},"modified":"2009-12-16T15:29:33","modified_gmt":"2009-12-16T14:29:33","slug":"windows-integrity-control-schreibzugriff-auf-eine-named-pipe-eines-services-ueber-anonymen-zugriff-auf-vista-windows-2008-server-und-windows-7","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2009\/12\/08\/windows-integrity-control-schreibzugriff-auf-eine-named-pipe-eines-services-ueber-anonymen-zugriff-auf-vista-windows-2008-server-und-windows-7\/","title":{"rendered":"Windows Integrity Control: Schreibzugriff auf eine Named Pipe eines Services \u00fcber anonymen Zugriff auf Vista, Windows 2008 Server und Windows 7"},"content":{"rendered":"<p>Mein Problem war ein Service, der eine Pipe als Interface zur Verf\u00fcgung stellt, auf die von beliebigen PCs zugegriffen werden soll. Insbesondere eben auch von PCs au\u00dferhalb der Dom\u00e4ne in der der Service l\u00e4uft der die Named Pipe zur Verf\u00fcgung stellt. Die Clients melden sich \u00fcber VPN an dem entsprechenden Server an, geh\u00f6ren aber eben selbst nicht zur Dom\u00e4ne.<\/p>\n<p>Von einem Rechner, der nicht in der Dom\u00e4ne des Rechners liegt, auf eine Pipe eines Rechners in einer Dom\u00e4ne zuzugreifen war schon immer mit extra Vorkehrungen verbunden. Der Code f\u00fcr den anonymen Zugriff auf eine Pipe finden wir als\u00a0KB Artikel <a href=\"http:\/\/support.microsoft.com\/kb\/813414\/en-us\">http:\/\/support.microsoft.com\/kb\/813414\/en-us<\/a>. \u00dcber die Qualit\u00e4t dieses Beispiels m\u00f6chte ich mich hier allerdings nicht auslassen.<\/p>\n<p>Dieses Sample ist nett f\u00fcr alle die XP und Windows 2003 Server nutzen. Und interessanter Weise funktioniert es auch auf <em>Windows Vista<\/em>, <em>Windows 7<\/em> oder <em>Windows Server 2008<\/em>. Aber nur weil dieses Beispiel die Pipe nur lesend benutzt.<\/p>\n<p>Dieses Programm ber\u00fccksichtigt nicht die neuen Sicherheitsfunktionen von <em>Vista<\/em>, <em>Windows 7 <\/em>oder <em>Windows Server 2008<\/em>. Es klappt genau dann nicht, wenn der Server eben auf einem <em>Vista<\/em>, <em>Windows 7<\/em>, oder <em>Server 2008\u00a0<\/em>l\u00e4uft UND die Pipe f\u00fcr Lesen und Schreiben ge\u00f6ffnet wird.\u00a0 ERROR_ACCESS_DENIED (5) ist das was der Client dann bekommt, wenn die Pipe lesend und schreibend ge\u00f6ffnet werden soll.<\/p>\n<p>Was ist das Problem \u2753<\/p>\n<p>Das Problem liegt in einem Sicherheitsmechanismus, der sogenannten <em>Windows Integrity<\/em>.<br \/>\nIch rate jedem die Literatur der nachfolgenden beiden Links:<\/p>\n<ul>\n<li>Windows Integrity Mechanism Design<br \/>\n<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb625963.aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/bb625963.aspx<\/a><\/li>\n<li>Windows Vista for Developers \u2013 Part 4<br \/>\n<a href=\"http:\/\/weblogs.asp.net\/kennykerr\/archive\/2006\/09\/29\/windows-vista-for-developers-_1320_-part-4-_1320_-user-account-control.aspx\">http:\/\/weblogs.asp.net\/kennykerr\/archive\/2006\/09\/29\/windows-vista-for-developers-_1320_-part-4-_1320_-user-account-control.aspx<\/a><\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<p><strong>Kurzbeschreibung:<\/strong><br \/>\nProzessen oder auch anderen Systemobjekten wird ein Inegrity-Level zugeordnet.<br \/>\nGreift nun ein Prozess auf ein Systemobjekt zu, dann werden nicht nur die allgemeinen Rechte gepr\u00fcft (z.B. Rechte f\u00fcr Anonymen Zugriff, oder die entsprechenden Gruppenrechte), sondern auch der <em>Integrity Level <\/em>dieses Prozesses wird mit dem der Ressource verglichen.<br \/>\nLiegt nun der <em>Integrity Level <\/em>des Clients niedriger als der <em>Intergrity Level <\/em>des Objektes, dann greift eine neue Policy, die dann festlegt was passiert. In den meisten F\u00e4llen bedeutet dies, dass der Lesezugriff zugelassen wird, aber der Schreibzugriff untersagt wird.<\/p>\n<p>\u00dcbrigens passiert das gleiche, wenn man ein Addin f\u00fcr den <em>IE8 <\/em>auf Vista (und sp\u00e4ter hat). Der <em>IE8 <\/em>l\u00e4uft im gesch\u00fctzten Modus und damit im <em>Integrity Level Low<\/em>. Normale Programme laufen im <em>Integrity Level Medium<\/em>.<br \/>\nM\u00f6chte nun das <em>IE8 <\/em>Addin eine Pipe oder einen Shared Memory Block eines Services oder eines &#8222;normalen&#8220; anderen Programmes, schreibend \u00f6ffnen, dann\u00a0passiert das gleiche. Der Zugriff wird reduziert auf nur lesen.<br \/>\nUnd dieses Thema wird haupts\u00e4chlich in der Doku und im Netz diskutiert (und zum Teil, gel\u00f6st).<\/p>\n<p>Ich will das jetzt hier nicht \u00fcber die Ma\u00dfen ausdehnen. Ich kann nur anraten, die entsprechenden Artikel wirklich einmal zu lesen.<\/p>\n<p>Jetzt zur\u00fcck zu dem was NICHT in diesen entsprechenden Artikeln und Forumbeitr\u00e4gen steht.<\/p>\n<p>1. Anonymen Zugriff wird automatisch der <em>Integrity Level Untrusted <\/em>zugewiesen. Die Doku zeigt in dem Beispiel nur die Vorgehensweise f\u00fcr den <em>Integrity Level low<\/em>.<br \/>\nMein Fehler war es, die ganze Zeit <em>SECURITY_MANDATORY_LOW_RID<\/em> zu verwenden. Aber ich sagte es schon: Der\u00a0 Anonyme Zugriff erfolgt im <em>Integrity Level Untrusted<\/em>.<\/p>\n<p>2. Ich arbeite mit <em>SDDL <\/em>String und auch dort in den Headern ist Low das niedrigste f\u00fcr das es im Netz und auch in der Doku (<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb625963.aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/bb625963.aspx<\/a>) findet. Dort steht ziemlich weit unten ein Beispiel, um ein Objekt einem &#8222;Low&#8220;-Integrity-Prozess zug\u00e4nglich zu machen. Und dort finden wir folgende SDDL Definition:<\/p>\n<pre lang=\"cpp\">#define LOW_INTEGRITY_SDDL_SACL_W L\"S:(ML;;NW;;;LW)\"<\/pre>\n<p>3. Anonymer Zugriff ist also <em>Integrity Level Untrusted<\/em> (ich wei\u00df ich wiederhole mich).<br \/>\nUnd nun wird es spa\u00dfig. Es gibt auch gar keinen <em>SDDL <\/em>Sid f\u00fcr untrusted, es gibt nur die folgenden Definitionen in den Headern:<\/p>\n<pre lang=\"cpp\">\/\/ Integrity Labels\r\n#define SDDL_ML_LOW\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TEXT(\"LW\")\r\n#define SDDL_ML_MEDIUM\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TEXT(\"ME\")\r\n#define SDDL_ML_MEDIUM_PLUS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TEXT(\"MP\")\r\n#define SDDL_ML_HIGH\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TEXT(\"HI\")\r\n#define SDDL_ML_SYSTEM\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TEXT(\"SI\")<\/pre>\n<p>Alles das hat mich in die Irre gef\u00fchrt und 2 Tage Arbeit gekostet.<\/p>\n<p>Als mir klar war, dass ich eine Regel f\u00fcr den <em>Untrusted Intergity Level <\/em>ben\u00f6tige, war die L\u00f6sung gefunden.<br \/>\nBauen wir uns einen eigenen <em>SID<\/em>! Aus der Doku k\u00f6nnen wir die entsprechenden <em>RIDs<\/em> finden und uns nun folgenden <em>SID <\/em>konstruieren: <em>&#8222;S-1-16-0&#8220;<\/em>.<br \/>\nUnd das bringt uns zu dem <em>SDDL <\/em>String f\u00fcr den Level untrusted:<\/p>\n<pre lang=\"cpp\">#define UNTRUSTED_INTEGRITY_SDDL_SACL _T(\"S:(ML;;NW;;;S-1-16-0)\")<\/pre>\n<p>Ich habe das oben beschriebene Sample etwas modifiziert, dass man genau dieses Problem des anonymen Zugriffs auf eine Pipe testen kann. <a href=\"http:\/\/blog.m-ri.de\/wp-content\/uploads\/2009\/12\/TestAnonymousPipe.zip\">Das Beispiel kann man hier herunterladen.<\/a><br \/>\nIch habe das Sample dazu etwas umgebaut:<\/p>\n<ul>\n<li>so dass lesender und schreibender Zugriff auch benutzt wird.<\/li>\n<li>dass SDDL verwendet wird, was den Code extrem simplifiziert.<\/li>\n<li>dass zumindest etwas an dem ekligem Code lesbarer wurde.<\/li>\n<li>dass ein paar Bugs raus sind.<\/li>\n<\/ul>\n<p>Ich bitte dennoch dies nur als Sample zu betrachten und nicht als Beispiel Software, die meinem Anspruch an C\/C++ Code gen\u00fcgt \ud83d\ude42<\/p>\n<p>PS: Eine entsprechende Diskussion \u00fcber das Problem findet sich in <a href=\"nntp:\/\/microsoft.public.de.vc\">nntp:\/\/microsoft.public.de.vc<\/a><br \/>\n<a href=\"http:\/\/groups.google.de\/group\/microsoft.public.de.vc\/browse_thread\/thread\/3be20505999b8aab\">http:\/\/groups.google.de\/group\/microsoft.public.de.vc\/browse_thread\/thread\/3be20505999b8aab<\/a><br \/>\nDanke noch mal explizit an den Regular Andreas Heyer f\u00fcr seinen wertvollen Diskussionsbeitrag.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mein Problem war ein Service, der eine Pipe als Interface zur Verf\u00fcgung stellt, auf die von beliebigen PCs zugegriffen werden soll. Insbesondere eben auch von PCs au\u00dferhalb der Dom\u00e4ne in der der Service l\u00e4uft der die Named Pipe zur Verf\u00fcgung stellt. Die Clients melden sich \u00fcber VPN an dem entsprechenden Server an, geh\u00f6ren aber eben &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2009\/12\/08\/windows-integrity-control-schreibzugriff-auf-eine-named-pipe-eines-services-ueber-anonymen-zugriff-auf-vista-windows-2008-server-und-windows-7\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eWindows Integrity Control: Schreibzugriff auf eine Named Pipe eines Services \u00fcber anonymen Zugriff auf Vista, Windows 2008 Server und Windows 7\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,3,17,2],"tags":[94,358,186,187],"class_list":["post-552","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","category-vista-2","category-windows-api","tag-security","tag-vista","tag-windows-7","tag-windows-server-2008"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/552","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=552"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/552\/revisions"}],"predecessor-version":[{"id":567,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/552\/revisions\/567"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=552"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=552"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=552"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}