Artikel lesen
Druckbare Version
Klingt Gut! Microsoft muss mit Windows Phone den unerforschten Ozean erobern, die Gebite und Leute die noch nie ein Smartphone hatten und somit gliech mit Windows Phone "aufwachsen". Und nicht erst getrügt werden durch den Schein eines Asteroiden oder ein biss in den (sauren) Apfel...
C++ Support klingt auch sehr positiv. So öffnet man sich auch einem größeren Feld an Entwicklern, die nicht im .NET Universum zu Hause sind. Würde mich nicht wundern wenn man ähnlich wie bei Windows 8 die Oberflächen in HTML 5 erstellen kann. Wenn schon nicht über Silverlight/Xaml, dann muss ja eine alternative her.
Schauen wir mal wie es umgesetzt wird =)
Würde durch C++ das unlocken einfacher?
Mit der kostenlosen PocketPC.ch App von meinem 7 Mozart aus geschrieben.
hmm, vielleicht. Man darf dann halt code ausführen, der über die Silverlight API hinausgeht. also etwa die Registry betrifft. Ich denke aber, auch hier wird eingeschränkt, sonst wäre ja der ganze closed market Weg futsch und die Sicherheit genauso wie bei Android in Gefahr.
klingt ja alles ganz nett.
Nur gibt es da nicht zuerst noch einige andere Baustellen, welche geschlossen werden sollten? z.B. eine vernünftige Backup-Möglichkeit oder ein "businesstauglicher" Kalender?
Oder bin er der einzige der diese Funktionen braucht oder besser, sind die Funktionen mit Tango sogar integriert?
Ich bin echt zufrieden mit WP7, nur die Businesstauglichkeit ist schon noch verbesserungswürdig und würde die Absatzchancen aus meiner Sicht wohl eher verbessern.
WP7 ist halt leider nicht explizit auf den Business-Markt ausgerichtet. Ich würd mir auch mehr Funktionalität diesbezüglich wünschen. Das mit dem Kalender und Exchange geht ja schon ganz gut, aber dass MS es nicht schafft, die MIME-Implementation sauber zu machen, so dass man auch die Anhänge signierter E-Mails lesen kann, ist unverständlich
Oder wie wärs denn mit nem einfachen Umlaut-Bugfix?
Sicher gibt's noch einige große Baustellen, aber wenn man das mal aus Sicht der Einwohner in den betroffenen Ländern sieht, dann ist für die die Sprachunterstützung sicher das wichtigste. Es kamen ja auch hier im Forum z.B. Anfragen ob WP7 auch türkisch kann, die User werden jetzt vermutlich zufriedengestellt.
Bei Nativ ausführbarem Code assoziiere ich direkt die nächsten Botnetz Meldungen für Windows Phone 7. Eigentlich sollten wir soweit sein, dass bei Hauptsächlich online geführten Geräten nativ ausgeführter Code strikt nicht erlaubt ist.
Hä?
Mit der kostenlosen PocketPC.ch App von meinem 7 Mozart aus geschrieben.
Nativ heißt doch das zb auf den kernel direct zugegriffen werden kann wie bei Android?
Wenn dann kommen bald die ersten Apps mit telefon zugriff und es werden fleißig Premiumnummern angerfufen
Ich trau mich wetten, dass es so etwas nie und nimmer ohne Einschränkungen geben wird. Wenn man die aktuellen Restriktionen betrachtet (einige machen durchaus Sinn), und mit Kernelzugriff vergleicht, dann ist das wie Tag und Nacht.
Bei Nativ laufendem Code hat man quasi direkten Zugriff auf den Speicher und auf Systemcalls. Das macht es (relativ) einfach, Schadcode auszuführen. Der Druck auf die Programmierer steigt dadurch, ihre Anwendungen sicher zu gestalten. Das ist aber alles andere als Simpel. Vor allen Dingen aber bei Anwendungen die Informationen aus dem Internet laden muss man dann aufpassen, dass durch JavaScript und ähnliche Techniken nicht einfach so Schadcode in den Speicher geschoben werden kann (Stichwort: Alternative Browser). Je nachdem welche Mängel das System hat (z.B. mangelndes ASLR) oder aber welche Exploits existieren, können dann Apps auch (relativ) einfach das ganze Missbrauchen um Daten abzugreifen, anrufe zu tätigen usw. auch ohne das der Anwender das merkt.
Das Umgeht man Momentan indem man wie bei .net die Anwendungen in eine Sandbox packt, bzw. den Anwendungen nur eine begrenzte Api zur Verfügung stellt (beides macht WinPhone soweit ich weiß, das ist auch der Grund warum Apple die Api begrenzt hat). Auf dem PC Windows benutzt man aus diesem Grund auch .net mit C# oder Visual C++ oder eben Java das in einer VM läuft. Das ganze nennt sich managed code (ein MS begriff, es darf gegooglet werden!).
Sicher ist der Geschwindigkeitsvorteil von nativem Code nicht zu verachten, aber der Tradeoff zwischen Sicherheit und Geschwindigkeit muss immer zu gunsten der Sicherheit ausgehen. Bei einem Smartphone ist mir aber die Sicherheit lieber, im Zweifelsfall kann ich lieber ein Spiel nicht spielen als dass mein Adressbuch bei irgendwelchen Leuten landet, die es ausspähen. Viele Firmen haben deshalb auch ein Problem damit, Android in ihre IT-Struktur zu integrieren und weichen auf Blackberry, iPhone und hoffentlich bald Windows Phone aus.
Bei der tatsächlichen Gefahr von Native Code muss ich jetzt mal einhaken. Rufe ich ein API auf in Managed Code wird so es eine Systemfunktion betrifft ja dann trotzdem von der CLR der Kernel aufgerufen (anders ginge es ja gar nicht). Ist der entsprechende Aufruf per Security Policy verboten wird er nicht durchgeführt. Ähnliche Policies kann ich jedoch auch für Managed Code gestalten, genauso wie eine Sand Box durchaus auch für Native Code möglich ist (beim iPhone nennt man die halt ein Jail und der Jailbreak ist das ausbrechen aus der Sandbox).
Microsoft führt z.B. am Desktop den Internet Explorer mit geringeren Rechten aus als die Rechte, die der User an und für sich zur Verfügung hätte. Das stellt wieder eine zusätzliche Hürde da.
Native Code ist also mitnichten synonym zu sehen mit unbeschränktem Zugriff auf das System bzw. auf APIs. Metro-Anwendungen unter Windows 8 die mit C++ geschrieben werden bekommen auch nicht automatisch vollen Systemzugriff und müssen mit den APIs der WinRT ein Auslangen finden.
Was momentan aber tatsächlich stimmt ist, dass man sobald man mal Native Code ausführen kann auf WP7 mit Hacks (hauptsächlich über die schlecht abgesicherten Tools der Gerätehersteller) Zugriff auf weitergehende Systemfunktionen bekommt.
Was Managed Code sicherer macht ist die Tatsache, dass die darin geschriebenen Programme manche Sicherheitsprobleme gar nicht aufweisen können, da wenn der Programmierer sie übersieht die CLR diese erkennt und abfängt (Buffer Overflows, Null-Pointer, etc.) Diese zusätzlichen Checks sind ja auch mit ein Grund für die schlechtere Performance. Das Zulassen von Native Code führt aber definitiv nicht automatisch dazu, dass das System sperrangelweit offen steht.
Wir sollten mal definieren was nativer Code ist: Ich verstehe darunter Code der in Maschinensprache umgewandelt wird und dann auf der Hardware ausgeführt wird (so hab ichs im Studium gelernt und finde es auch bei Wikipedia ;) )
Eine Sandbox für nativen Code müsste also die Maschinensprache interpretieren und auf einer Virtuellen Maschine ausführen, um die Zugriffe zu kontrollieren, wo wir dann wieder beim Managed Code wären (ob das nun Bytecode, Zwischencode oder Assembler ist spielt ja keine Rolle). Damit haben wir dann faktisch keinen nativen Code mehr. Der Aufruf von Apis in Nativem Code kann wenn ich mich recht erinnere auch zur "Laufzeit" nicht überwacht werden.
Aber du hast recht man verlagert das Problem nur in die Sandbox, Jail, VM wie auch immer man das sehen will. Allerdings kann man dort zur Laufzeit des Programmes z.B. über den CLR (dafür ist der ja gemacht und er arbeitet mit Zwischencode) die Aufrufe des ausgeführten Programms überwachen und ggf. abfangen.
Da stellt sich die Frage ob der IE Managed läuft oder nicht. Soweit ich weiß nicht. Exploiting funktioniert ja in der Regel so, dass man eine Methode über eine Eingabe dazu bewegt beliebige Informationen in den Speicher zu schreiben. Dazu ist es notwendig das die Methode das entweder anbietet oder eben einen Bug hat. Bei nativem Code kann eigentlich nichts die Methode aufhalten. Bei Managed Code würde die Beschränkung der Sandbox greifen. Allerdings führt ein Exploit in der Sandbox natürlich wiederrum zum gleichen problem.
Da unter Windows C++ Managed (visual C++) und unmanaged funktioniert ist C++ nicht zwangsläufig Synonym für native Ausführung. Ich hab nun die Metrofunktionalität noch nicht angeschaut, aber würde mal behaupten, es handelt sich dabei um eine in .net umgesetzte Managed Code Geschichte, an denen hat Microsoft aufgrund der Sicherheitsaspekte hohes interesse.
Alternativ könnte man bei der Kompilierung schon überwachen was passiert, allerdings würde man damit die Möglichkeit der Manipulation eröffnen, sofern nicht MS selbst die Sachen kompiliert oder aber in irgend einer Form eine Zertifizierung entwirft, die Verifiziert, dass ein korrekter Compiler verwendet wurde. Da halte ich Managed Code aber ebenfalls für Wahrscheinlicher und auch Sinnvoller.
Das hab ich auch nicht geschrieben ;) Allerdings wird die Wahrscheinlichkeit, dass Schadprogramme Zugriff bekommen drastisch erhöht und viel Verantwortung an die Entwickler weiter gegeben, die damit auch erst mal umgehen müssen.
Eine Möglichkeit das zu verhindern wäre z.B. das Microsoft die Programme signieren muss und vorher einer Prüfung unterzieht und dabei untersucht ob bestimmte System Calls getätigt werden.
Da unterschätzt du die Möglichkeiten des Betriebssystems relativ stark. Natürlich setzt das auch eine gewisse Unterstützung auf Hardwareebene vorraus aber die ist seit dem 80386 von Intel gegeben und auch auf den ARM-CPUs so. Bloß weil Code schon in Maschinensprache übersetzt ist, bedeutet das nicht, dass er tun und lassen kann was er will.
Das geht schon damit los, dass jeder Prozess seinen eigenen virtuellen Adressraum bekommt, der dann vom Betriebssystem mit Hardwareunterstützung auf physische Adressen abgebildet wird. Was nicht in diesen virtuellen Adressraum eingeblendet wird ist für das Programm auch nicht erreichbar.
Dass ein Programm sobald es läuft nicht alles tun und lassen kann was es will zeigt sich doch auf jedem Windows-System im Firmenumfeld. Die Überprüfung von Zugriffsberechtigungen auf Dateien prüft das Betriebssystem, nicht die laufende Software. Wenn ich Assembler programmiere bin ich programmiertechnisch schon so nahe am Maschinencode wie nur irgend geht - da übersetzen sich die Befehle meistens 1:1 in einen CPU-Befehl (mussten im Studium das auch von Hand umschreiben aber das ist ein anderes Thema). Will ich eine Datei lesen muss ich den Pfad in den Speicher schreiben und dann einen bestimmten Interrupt auslösen bei entsprechendem Registerinhalt, damit das Betriebssystem die Datei öffnet und mir die Daten daraus zur Verfügung stellt. Direkt auf den Festplattentreiber kann ich so nicht zugreifen. Und der virtuelle Adressraum verhindert auch dass ich direkt die Hardware mit einem eigenen Treiber anspreche.
Den Aufruf der API kann ich so nicht verhindern, jedoch kann das Betriebssystem wenn der Aufruf kommt innerhalb dieses Aufrufs (der ja im Kontext des Betriebssystems stattfindet) überprüfen ob der Aufrufer (der ist ja bekannt, sonst könnte man ihm nichts zurückgeben) die entsprechende Berechtigung hat und sonst gibt man halt gleich zu diesem zurück ohne die gewünschte Aktion auszuführen - oder beendet den Prozess wegen einer Zugriffsverletzung.
Bei den meisten Exploits geht es auch weniger darum den auszuführenden Code in den Speicher des Ziels zu kriegen sondern eher darum dieses dann dazu zu bringen, den auch auszuführen. Bei Buffer-Overflows geht das z.B. so, dass man soweit über das Ende des Puffers schreibt, dass man das eigentliche Programm überschreibt und im weiteren Verlauf dann dieser Code ausgeführt wird. Problematisch ist dann also wenn der gekaperte Prozess Rechte hat mit denen er im System etwas tun kann. Ist dies nicht der Fall sind noch weitere Bugs in anderen Prozessen nötig um die Rechte soweit zu eskalieren, dass das Betriebssystem bereit ist die gewünschten Schritte auszuführen.
Das setzt aber auch ohne ASLR, etc. schon einiges an können voraus, da normalerweise das schreiben in nicht dafür vorgesehenen Speicher zu einem Segmentation Fault seitens des Betriebssystems führt.
Fakt ist: Native Code hat nicht komplett freie Hand auf einem System - auch wenn es direkte Maschinencode-Anweisungen sind.
Der C++ Anteil in Windows 8 Metro ist Native Code, es handelt sich nicht um Managed C++.
Nebenbei erwähnt führen Exploits in der CLR auch zu Sicherheitsprobleme aber ich muss sie dann nur in einer Komponente beheben statt in 1000en (das setzte der Java-VM eine Weile ganz schön zu). Allerdings haben das Problem dann auch gleichzeitig 1000e Apps statt einer (unterm Strich läuft aber meistens mehr Zeit in Security Audits einer VM als einzelner Apps, sodass die Sicherheit meistens von Managed Code mehr profitiert).
Nachdem Aufrufe sich aus Speicheradressen und Registerinhalten zusammensetzen ist eine statische Analyse welche Aufrufe Native Code macht nicht so ohne weiteres möglich. Man müsste alle möglichen Ausführungspfade prüfen (eine potentiell enorme Menge). Vor ähnlichen Problemen steht die Analyse bei .Net wenn die Aufrufe per Reflection passieren (da ist ein Check auch erst zur Laufzeit möglich). Das Problem mit Reflection äußert sich bei WP7 konkret darin, dass wenn ich bestimmte Methoden nur via Reflection aufrufe, die zur Ausführung eine bestimmte Permission brauchen (z.B. GPS-Zugriff), die bei Aufnahme in den Marketplace nicht erkannt wird => meine App hat die Permission auf dem Gerät dann nicht und stürzt ab wenn sie versucht die GPS-Koordinaten zu bestimmen.
Das Problem ist einfach, dass es bei nativem Code zig Möglichkeiten gibt, Lücken zu nutzen. Das ganze lässt sich auch nicht wegdiskutieren. Ich habe nicht gesagt das dann allem Tür und Tor offen steht, sondern dass die Sicherheit darunter leidet. Das ist nun mal leider ein Fakt. Simplerweise weil meine Sicherheitslücke in der Sandbox zu suchen ist, was zugegebener Maßen auch passieren kann, aber einfach viel weniger da ist, was nicht gut Programmiert worden ist.
Du hast auch recht, aber wenn ich jetzt hier anfange das bis auf Heller und Pfennig zu zerlegen wie was überprüft wird und was dabei vor sich geht und wie man was umgehen kann, dann werden das 100te von Seiten. Z.B. reicht es aus Rootrechte zu bekommen und seinen Code auszuführen um direkt ne Berechtigung für quasi alles zu bekommen und dafür muss ich quasi nur eine geeignete Lücke finden ein Rootkit zu installieren, was wie wir wissen bei Windows kein großes Problem bisher war, auch aufgrund der Größe des ganzen Systems. ALSR war bisher auch nur eine Hürde die man überspringen musste. Und wie ich selbst schon feststellen musste arbeiten auf der Gegenseite wirklich findige Programmierer und auch nicht so findige Programmierer mit Webbrowser Exploits ASLR umgehen können.
Nicht umsonst werden in vielen Hochsicherheitssystemen quasi nur noch Virtualisierungen verwendet um die Menge an Code klein zu halten, die überprüft werden muss.
Ich halte es nach wie vor nicht für Sinnvoll das nativer Code ausgeführt wird, weil die Vorteile so viel Geringer gegenüber den daraus entstehenden Nachteilen sind. Viel eher wäre ich dafür eine WinRT für die Spiele zu erstellen und zu optimieren um daraus den Geschwindigkeitsbonus zu erhalten.
Kurzes Googlen ergab übrigens folgendes:
http://i.stack.imgur.com/ZLtaJ.jpg
Wie ich es mir schon gedacht habe, läuft Metro in Windows 8 als managed Code.
Über die Grafiken gab es einiges an Diskussion (bzgl. deren Klarheit) aber was du hier siehst sind die WinRT-APIs auf denen dann entweder C#/VB.Net Managed läuft oder eben C++ mit nativem Zugriff (bzw. in C++ funktioniert das ganze dann über das altbekannte COM).
Nachzulesen, z.B. hier: http://www.heise.de/developer/artike...artikelseite=2