Posts mit dem Label Java werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Java werden angezeigt. Alle Posts anzeigen

09.09.2014

Signierten Code mit Java erstellen

Man hat's nicht leicht, mit den ganzen Updates Schritt zu halten ... Dauernd Sicherheitslücken in Windows, Flash, Java, sogar in Android findet sich die eine oder andere Lücke.
Um den Erfolg der Updates zu überprüfen, insbesondere für Flash und Java, hatte ich mir vor langer Zeit eine ganz primitive Webseite erstellt, die mir die aktuellen Versionsnummern der installierten Plugins anzeigen kann.

Seit Version 1.7 der Java Runtime werden aber lästige Warnungen ausgegeben, dass demnächst nur noch signierter Code ausgeführt wird, dass Code, der von http- und nicht https-Schema nachgeladen wird, als unsicher betrachtet wird, und überhaupt lassen die Sicherheitseinstellungen der JRE demnächst gar nix mehr zu.

Also hab ich mich mal drangesetzt und aus meiner .class-Datei eine .jar-Datei gemacht, die ich mit meinen eigenen, selbst erstellten Key signiert habe. Das ist aber natürlich nur die halbe Miete, weil man auch der JRE im Browser klarmachen muss, dass der self-signed Code auch wirklich zulässig ist. Man muss also in der policy-Datei auch noch Änderungen vornehmen. Hier ist der ganze Ablauf zusammengestellt, den ich durchlaufen musste, bis meine simple JRE-Versionsabfrage mit Firefox 31, Chrome 36 und JRE 1.8.0.11 wieder funktioniert hat.

Hier ist zunächst der Code für die Ausgabe der JRE-Versionsnummer:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Label;
public class JavaVersionDisplayApplet extends Applet
{
  private Label V;
  public JavaVersionDisplayApplet() {
    this.setBackground(Color.pink);
    V = new Label(" Java Version: " + System.getProperty("java.version") + " from " + System.getProperty("java.vendor"));
    this.add(V);
  }
}
Um diesen Code zu kompilieren, muss das Java Development Kit mit dem javac-Compiler installiert sein. Da Java einigermaßen kompatibel zu alten Versionen ist, kann man auch mit einer aktuellen JRE wie 1.8 noch Code ausführen, der mit Version 1.4 kompiliert wurde. Eine Krankheit von Java ist, dass der Dateiname exakt dem Klassennamen in der Datei entsprechen muss, hier also "JavaVersionDisplayApplet.java".
javac JavaVersionDisplayApplet.java
Als nächstes müssen noch zwei Dinge vorbereitet werden: ein Schlüsselpaar für das Signieren und eine Manifest-Datei, in der der Java-Code etwas genauer beschrieben wird, also etwas poetischer gesagt: Meta-Daten.

Zunächst also das Schlüsselpaar mit dem Programm keytool erzeugen, dass bei der JRE und beim JDK mitgeliefert wird.
keytool -genkeypair -alias thomas -keystore seeling.jks -dname "CN=Thomas Seeling, OU=System Administration, O=Kleintierpraxis Berstadt, L=Berstadt, ST=Hessen, C=DE" -keypass Password1 -storepass Password2
Im weiteren verwende ich immer den Aliasnamen "thomas" für den Schlüssel. Je nach Zusammenhang ist damit entweder der private oder der öffentliche Schlüssel gemeint.

Als nächstes benötige ich noch den öffentlichen Schlüssel separat, damit ich ihn in meinem Browser importieren kann. Dieser Schritt würde entfallen, wenn ich den Schlüssel von einer öffentlichen Root CA signieren lasse oder wenn ich mir selbst eine Root CA gebaut habe und den öffentlichen Schlüssel dieser Root CA schon in meinem Browser hätte.
keytool -export -keystore seeling.jks -alias thomas -storepass Password2 -file tseeling.cer
Ich mag meine Schlüssel lieber in base64-kodiert, also wandle ich die binäre .cer-Datei noch in eine PEM-Datei um:
openssl x509 -in tseeling.cer -inform DER -out tseeling.pem -outform PEM
Weil dies "nur" ein öffentlicher Schlüssel ist, benötige ich nach dem Export aus dem Java-Keyring kein Passwort mehr.
Diese PEM-Datei kann ich nun bequem über ein Transportmittel wie Email, ftp etc. zu meinem Browser-PC übertragen und dort importieren.

Desweiteren benötige ich die schon erwähnte Manifest-Datei, die mit in die .jar-Datei gepackt und signiert werden muss. Diese Datei sieht bei mir so aus:
Permissions: sandbox
Codebase: https://admin.moeller-seeling.local/*
Application-Name: JavaVersion
Der "Application-Name" ist hier nur "Schmuck am Nachthemd" und wird für eine Infobox benötigt, in der die JRE dem Benutzer anzeigt, wer da gerade ausgeführt werden soll.

Wenn das alles zusammengestellt ist, wird nun in zwei Schritten aus der kompilierten Java-Datei und dem Manifest zunächst eine .jar-Datei erzeugt und dann diese Datei mit dem zuvor erstellten privaten Schlüssel signiert.
jar -cfm JavaVersion.jar JavaVersion.txt JavaVersionDisplayApplet.class
jarsigner -keystore /opt/jdk/jre/lib/security/seeling.jks -keypass Password1 -storepass Password2 -verbose JavaVersion.jar thomas 

 Puh, fast geschafft! Jetzt noch diese .jar-Datei in einem kleinen HTML benutzen und vom Webserver ausliefern lassen. Darauf gehe ich nur ganz kurz ein, hier ist ein Beispiel für den HTML-Code:
<table border="1">
<tr><th> The version and vendor from the JRE</th>
<td align="center">
<applet height="60" alt="Browser has Java disabled"
hspace="22" width="440"
archive="JavaVersion.jar"
code="JavaVersionDisplayApplet.class">
</applet>
</td></tr>
</table>
Soweit, so gut. Das war der erste Schritt auf dem Webserver.

Auf dem Browser-PC sind auch noch kleine Schritte nötig, damit man ein self-signed .jar ausführen darf:
man muss in die Security-Policy einen Eintrag machen, dass signierte Dateien von bestimmten Programmierern erlaubt sind, und man muss den öffentlichen Schlüssel dieses Programmierers in den Standard-Keystore der JRE importieren, die der Browser im Java-Plugin verwendet, oder alternativ einen anderen Keystore angeben, in dem dieses Zertifikat enthalten ist.

Auf Windows findet sich das unter "%ProgramFiles(x86)%\java\jre8\lib\security\java.policy" (für die Java-Version 1.8).

Zu dieser (i.a. schon vorhandenen Datei) im Klartextformat habe ich folgende Einträge hinzugeführt:

keystore "file:${java.home}/lib/security/seeling.jks", "jks";
grant signedBy "thomas" {
  permission java.security.AllPermission, signedBy "thomas";
};
Zu der Liste der vertrauenswürdigen Zertifikate habe ich meinen öffentlichen Schlüssel hinzugefügt, den ich weiter oben als PEM-Format gespeichert hatte.
keytool -importcert -noprompt -trustcacerts -alias thomas -file tseeling.pem -keystore "%ProgramFiles(x86)%\java\jre8\lib\security\cacerts" -storepass changeit
Das Passwort der Schlüsseldatei "cacerts" ist üblicherweise "changeit". Natürlich ändert es nie jemand ;)

So, nachdem also nun ganz viele kleine Gemeinheiten geschafft sind, müsste im Browser ein Applet funktionieren, das die JRE-Versionsnummer ausgibt. Wenn man auch nur einen dieser Schritte weglässt, klappt es nicht und entweder der Browser oder die JRE beschimpfen mich, dass alles ganz schröcklich unsicher ist.

11.10.2013

Der monatliche Patch-Tag

Hach ja, es ist mal wieder soweit. Nachdem Microsoft sich mit der Anzahl an Fehlerkorrekturen nicht lumpen lässt, ziehen auch Oracle und Adobe nach. Oracle ist schon ein bißchen her (10. September), aber dafür haben sie auch kräftig die Versionsnummer auf 40 erhöht.

Die Abkündigung von Windows XP im nächsten April ist ein willkommener Anlass für mich, eine Umstellung vorzunehmen, die ich schon länger plane: ich werde die PCs in der Praxis auf Linux umstellen und nur noch die altehrwürdige Praxis-Software, die meine Frau seit 10 Jahren gewöhnt ist, in einer VM laufen lassen. Da diese virtuelle Windows-Umgebung dann keinen Internet-Zugang haben wird, brauche ich mir um die Sicherheit dort keine Gedanken machen. Dazu später mehr.

Als freundliches Service-Blog für Updates noch ein paar Bequemlichkeiten zum einfachen Herunterladen und Installieren der Updates:

Windows- und Office-Updates

Hier empfehle ich das geniale Offline-Update
Damit kann man alle wichtigen Update-Dateien einmalig herunterladen und dann auf allen Rechnern verteilen. Die meisten neueren DSL- oder LTE-Router haben einen USB-Anschluss für eine externe Festplatte. Es bietet sich an, die Updates auf diese Festplatte zu werfen und dann auf allen PCs das Update zu starten. Das belastet dann den Monatsetat (sprich Downloadvolumen) nur einmal und nicht für jeden PC einzeln ;)

Das Offline-Update hat ein komfortables GUI, man kann aber natürlich die darunterliegenden Skripte auch einzeln aufrufen:

Download:
Je nach Vielfalt der heimischen Rechnerlandschaft müssen die Befehle unten ausgewählt werden, und den Proxy erwähne ich nur noch ganz kurz.

set P1=/includedotnet /nocleanup /skiptz /proxy http://192.168.100.100:3128/
set P2=               /nocleanup /skiptz /proxy http://192.168.100.100:3128/

call cmd\DownloadUpdates.cmd wxp deu %P1%
call cmd\DownloadUpdates.cmd w61-x64 glb %P1%
call cmd\DownloadUpdates.cmd w61     glb %P1%

call cmd\DownloadUpdates.cmd ofc     glb %P2%
call cmd\DownloadUpdates.cmd ofc     deu %P2%

call cmd\DownloadUpdates.cmd o2k3  deu %P2%
call cmd\DownloadUpdates.cmd o2k7  deu %P2%
call cmd\DownloadUpdates.cmd o2k10 deu %P2% 
Legende:
wxp = Windows XP
w60 = Windows Vista
w61 = Windows 7
w62 = Windows 8
o2k3 = Office 2003
o2k7 = Office 2007
o2k10 = Office 2010
 Installation:
@echo off
net use u: \\nas\update
cd /D U:\

client\cmd\DoUpdate.cmd /nobackup /updatecpp /instie8 /updatercerts /updatedx /updatetsc /instdotnet35 /instdotnet4 /instpsh /instofccnvs /instmssl
Diese Kommandozeile installiert fast alles, außer dem Update für den Media-Player. Auch hier gilt: Anpassen an das eigene NAS nötig.

Flash-Update für Windows

Auch hier bietet es sich an, einmalig die Updates herunterzuladen (für Internet Explorer und Firefox sind das immerhin mittlerweile auch zweimal 16 MB) und dann auf allen PCs zu installieren.

Download:
(wer einen Proxy verwendet, muss das "rem" entfernen und seine eigene Proxy-Adresse eintragen)
(in der "TO"-Zeile ggfs. den eigenen Netzwerkspeicher eintragen)

@echo off

rem set http_proxy=http://192.168.100.100:3128/
set V=11.9.900.117
set TO=\\nas\win\Adobe
set H=fpdownload.macromedia.com
set P=/get/flashplayer/current/licensing/win
set AX=install_flash_player_11_active_x.exe
set NP=install_flash_player_11_plugin.exe

wget http://%H%%P%/%AX% -O %TO%\flash-%V%_ax.exe
wget http://%H%%P%/%NP% -O %TO%\flash-%V%_np.exe

Installation:
@echo off
set V=11.9.900.117

set TO=\\nas\win\Adobe

%TO%
\flash-%V%_ax -install

%TO%\flash-%V%_np -install

Acrobat-Reader-Update für Windows

Diesen Monat gibt es "nur" ein Update für die Version XI; die behobenen Fehler (Regression, also: alter Fehler taucht erneut auf) scheint es in Version X nicht zu geben. Version X ist nach wie vor bei 10.1.8.

Download:
@echo off

rem set http_proxy=http://192.168.100.100:3128/
set TO=\\nas\win\Adobe
wget -O %TO%\
AdbeRdrSecUpd11005.msp ftp://ftp.adobe.com/pub/adobe/reader/win/11.x/11.0.05/misc/AdbeRdrSecUpd11005.msp
Installation:
msiexec /i %TO%\AdbeRdrSecUpd11005.msp /qb-!

Java-Update für Windows (32 bit)

Hier ist die Downloadseite von Java 7.

Installation:Für Windows 7 die erste Zeile mit "set TO=..." verwenden, für Windows XP die zweite.
wget http://download.oracle.com/otn-pub/java/jdk/7u40-b43/jdk-7u40-windows-i586.exe
set TO=%ProgramFiles(x86)%\jdk170
set TO=
%ProgramFiles%\jdk170
set EXE=jdk-7u40-windows-i586.exe
set OPT=INSTALLDIR=\"%TO%\" JAVAUPDATE=1 CUSTOM=1 ADDLOCAL=jrecore
"%EXE%" /s /v"/qb /norestart %OPT% IEXPLORER=1 MOZILLA=1 REBOOT=Suppress WEBSTARTICON=0 SYSTRAY=0 EULA=1 AUTOUPDATECHECK=0 RebootYesNo=No"
"%TO%\bin\javac" -version"%TO%\jre\bin\java" -version
Installation der JRE statt JDK:
genau wie oben, nur überall "jdk" durch "jre" ersetzen.
Wenn man das JDK haben will, z.B. für das Android SDK, braucht man natürlich die JRE nicht mehr zu installieren, die bekommt man mit dem JDK automatisch dazu.

Java-Update für Redhat Linux (32 bit)

wget http://download.oracle.com/otn-pub/java/jdk/7u40-b43/jdk-7u40-linux-i586.tar.gz
Java für Linux kann man entweder als rpm oder als .tar.gz herunterladen. Ich habe eine bestimmte Vorstellung davon, wo es installiert wird, deshalb verwende ich das .tar.gz und muss dann natürlich die Symlinks mit dem "alternatives"-Befehl ebenfalls von Hand setzen. Das sieht dann so aus (als root aufrufen):

#!/bin/sh -e

what=1.7.0
patch=40
jver=1.7.0_${patch}
cur=jdk$jver
sver=1700${patch}
curjre=/usr/java/$cur/jre
curjava=/usr/java/$cur/bin

rmold() {
    name="$1"
    oldver=$(alternatives --display "$name" | awk '/currently points to.*'"$what"'/{print$NF}')
    if [ -n "$oldver" ]
    then
        echo "Unregister $oldver"
        alternatives --remove "$name" "$oldver" 2>/dev/null
    fi
}

rmold java
alternatives --install /usr/bin/java   java   $curjre/bin/java   $sver \
--slave /usr/bin/ControlPanel ControlPanel $curjre/bin/ControlPanel \
--slave /usr/bin/keytool      keytool      $curjava/keytool \
--slave /usr/bin/policytool   policytool   $curjava/policytool \
--slave /usr/bin/rmid         rmid         $curjava/rmid \
--slave /usr/bin/rmiregistry  rmiregistry  $curjava/rmiregistry \
--slave /usr/bin/tnameserv    tnameserv    $curjava/tnameserv \
--slave /usr/lib/jvm/jre      jre          /usr/java/$cur

rmold javaws
alternatives --install /usr/bin/javaws javaws $curjre/bin/javaws $sver

rmold javac
alternatives --install /usr/bin/javac  javac  $curjava/javac      $sver

rmold jar
alternatives --install /usr/bin/jar    jar    $curjava/jar        $sver

if [ -f $curjre/lib/i386/libnpjp2.so ]
then
    rmold libjavaplugin.so
    alternatives --install /usr/lib/mozilla/plugins/libjavaplugin.so   libjavaplugin.so        $curjre/lib/i386/libnpjp2.so  $sver
fi

if [ -f $curjre/lib/amd64/libnpjp2.so ]
then
    rmold libjavaplugin.so.x86_64
    alternatives --install /usr/lib64/mozilla/plugins/libjavaplugin.so libjavaplugin.so.x86_64 $curjre/lib/amd64/libnpjp2.so $sver
fi

echo Checking ...
java -version  2>&1 | grep -q "$jver" && echo JRE $jver ok
javac -version 2>&1 | grep -q "$jver" && echo JDK $jver ok

22.07.2013

Sicherheit beim electronic banking

In den letzten Tagen ging eine einigermaßen spektakuläre Meldung durch die Presse: beim electronic banking wurden über 40.000 Euro gestohlen. Ursprünglich ging es wohl um mehr als 100.000 Euro, von denen aber ein Teil von den Banken zurückgebucht werden konnte.

Unabhängig vom Verlauf dieser Aktion und der Frage, wer nun zu welchem Zeitpunkt einen Fehler gemacht hat, will ich mal zusammen sammeln, wie man das electronic banking und generell seinen PC "sicher" machen kann, wenn man das Internet benutzen will.

Vorweg: absolute Sicherheit gibt es nicht. Die Bösewichte werden immer einfallsreicher. Es läuft auf ein Hase-und-Igel-Wettrennen hinaus. Wie beim Absichern der eigenen Wohnung gegen Einbrecher: es muss nicht perfekt sein, aber es muss den Bösewicht so viel Mühe kosten, dass er von seinem schändlichen Tun ablässt (und sich ein leichteres Opfer sucht).

Nun konkreter zum Absichern von electronic banking. Die meisten der Ratschläge sind allgemein verwendbar, aber man sollte sie unbedingt beherzigen, wenn man via Internet seine Bankgeschäfte erledigen will.

Viele der folgenden Tipps überschneiden oder ergänzen sich. Wenn Sie mehrere davon für sich einsetzen, sollte das Ihre Sicherheit deutlich steigern.

  • Nicht Windows verwenden. Windows ist so weit verbreitet, dass es sich für Bösewichte ganz besonders lohnt, hierfür Schadprogramme zu entwickeln. Dieser Ratschlag ist nicht ideologisch gemeint, sondern eine statistische Tatsache. Verwenden Sie Linux oder Apple mit einem passenden ebanking-Programm. Für browserbasiertes ebanking geht sogar ein "browser-only" Netbook mit Googles ChromeOS, z.B. von Samsung.
  • Verwenden Sie einen separaten PC nur für das ebanking. Vermeiden Sie dort die Installation von unnötiger Software, wenn es für das ebanking nicht unbedingt nötig ist. Surfen Sie nicht mit diesem PC. Verwenden Sie den PC wirklich nur für das ebanking. Rufen Sie mit diesem PC keine anderen Webseiten auf. Erledigen Sie mit diesem PC nicht Ihre Email.
    Kaufen Sie z.B. ein kleines Netbook gebraucht bei ebay, das sollte für unter 100 Euro möglich sein. Man bekommt für diesen Betrag einen kleinen PC mit intel Atom, 1 GB RAM, Festplatte ist vollkommen unwichtig (20-40 GB reichen völlig, am bequemsten wäre natürlich SSD statt einer mechanischen Festplatte). Löschen Sie den PC komplett und richten Sie ihn selbst neu ein, selbst wenn der Verkäufer ein "neu installiertes Windows" anbietet.
  • Verwenden Sie zum ebanking ein separates Betriebssystem, das Sie von einer CD oder von einem schreibgeschützten USB-Stick starten. Die c't bietet hierzu kostenlos die Linux-Variante "Bankix" an.
  • Verwenden Sie niemals ein öffentliches WLAN für Ihre Bankgeschäfte. Mag sein, dass die Funkstrecke mit WPA2 gesichert ist, aber ab der Basisstation ist es ungeschützt und kann belauscht werden.
  • Achten Sie auf Warnungen im Browser, dass die Website, die Sie besuchen wollen, "unbekannt" ist oder das Zertifikat ungültig oder abgelaufen ist. Dies sind Anzeichen dafür, dass Sie nicht die gewünschte Website besuchen, sondern Ihnen ein anderes Ziel "untergeschoben" wurde. Lesen Sie den Sicherheitshinweis genau durch. Im Zweifelsfall fragen Sie die Hotline Ihrer Bank und gehen nicht weiter.
  • Installieren Sie in Ihrem Browser "Add-Ons" oder "Extensions", die einige der Sicherheitsprobleme umgehen, indem bestimmte Funktionen abgeschaltet oder nur bei zugelassenden Websites aktiviert werden ("whitelist"). Zugegeben: damit wird das Surfen umständlicher, aber definitiv sicherer. Ich empfehle "uBlock origin" "Adblock Plus Edge", "NoScript" bzw. "NotScripts", "Secure Login" und "Better Privacy". Genauer erklärt habe ich das hier schon mal. Blättern Sie bis zu der Frage "Was kann man dagegen machen?"
  • Achten Sie darauf, wenn Sie Mitteilungen bekommen, dass sich an einem Zugang zu einem Dienst im Internet etwas geändert hat. Google, PayPal etc. verschicken Emails, wenn jemand das Passwort ändert. Schalten Sie diese Benachrichtigungsfunktion nicht ab! Wenn Sie die Änderung nicht selbst veranlasst haben, ist höchste Alarmstufe! Dann hat jemand einen Ihrer Online-Zugänge geknackt. Versuchen Sie, so schnell wie möglich den eigenen Zugang wiederzuerlangen. Meistens ist ein Angriff auf das Emailkonto der erste Schritt zum Online-Finanzbetrug und -Kontomissbrauch! Wer die Email kontrolliert, kann bei anderen Diensten Passwörter, Handynummern etc. ändern und die Warnungen darüber abfangen.
  • Verwenden Sie unterschiedliche Passwörter für jeden Internetdienst. Niemand kann sich alle Passwörter merken, das ist auch gar nicht schlimm. Verwenden Sie einen Passwortgenerator oder Passwortsafe, der komplizierte, zufällige Passwörter erzeugen kann. Die üblichen Programme für diesen Zweck können das Passwort automatisch in den Browser übertragen, so dass Sie es nicht umständlich abtippen müssen. Alternativ können Sie Ihre Passwörter aufschreiben oder speichern (ich nehme eine Tabellenkalkulation dafür und speichere die Passwortdatei verschlüsselt auf einen USB-Stick ab).
    Ein paar ganz gute Ratschläge finden sich beim BSI oder mit dieser Google-Suche.
  • Öffnen Sie in Ihrer Email keine Dateianhänge, wenn Sie keine Zusendung von Anhängen erwarten. Sprechen Sie mit dem Absender, ob er Ihnen wirklich einen Anhang zugeschickt hat, bzw. sprechen Sie vorher ab, dass Ihnen Dateien geschickt werden.
  • Klicken Sie in Ihrer Email nicht auf WWW-Adressen (URLs).
  • Schalten Sie in Windows die Anzeige von Dateiendungen ein. Windows unterdrückt normalerweise diese Anzeige, aber dadurch übersieht man häufig, dass man z.B. kein PDF anklickt, sondern eine Datei, die Rechnung.PDF.EXE heißt (doppelte Dateiendung).
    Speichern Sie Dateianhänge ab. Dabei kann der Virusscanner die Datei überprüfen. Beachten Sie die Warnungen, falls welche angezeigt werden.
  • Verwenden Sie unübliche Programme. Die haben normalerweise nicht die gängigen Sicherheitslücken (vielleicht andere, aber unübliche ;) ).
    Nehmen Sie z.B. Foxit statt Acrobat Reader oder lesen Sie PDF in den neueren Versionen von Firefox oder Google Chrome.
    Verzichten Sie auf Flash. Das ist derzeit noch ein wenig schmerzhaft, aber Youtube z.B. setzt zunehmend mehr auf Videos in HTML5-Technik. Flash ist eigentlich nur eine Ansammlung von Sicherheitslücken. Allein im Februar gab es drei Notfall-Updates.
  • Mißtrauen Sie prinzipiell jeder Email, in der es um Geld geht oder um eine Firma, die Ihnen androht, dass eines Ihrer Online-Konten gesperrt wird, wenn Sie nicht umgehend dort Ihr Passwort und eine TAN eingeben (oder sinngemäß ähnlich). Ihre Bank, ebay oder Paypal schicken prinzipiell keine Emails, dass Ihr Konto gesperrt wird.
  • Achten Sie zeitnah auf die Installation sämtlicher Fehlerkorrekturen für das Betriebssystem und die ebanking-Software.
  • Achten Sie auch auf Updates für den Browser, für Oracle Java Runtime, Acrobat Reader und Flash (nicht Zutreffendes streichen ;) ).
  • Schalten Sie in allen Programm die automatische Update-Funktion ein, soweit möglich.
  • Ein Virenscanner nutzt nur, wenn er verhaltensbasiert überwachen kann. Viren und Trojaner ändern sich erfahrungsgemäß im Stundentakt. Wenn ein Antivirus-Programm Schadprogramme nur anhand ihrer "Kennungen" (Signaturen) erkennen kann, ist es immer im Nachteil. Insbesondere bemerken die Programmierer von Schadprogrammen, wenn ein Antivirus-Hersteller neue Kennungen veröffentlich, und passen dann sofort ihre Schädlinge an.
    Achten Sie darauf, dass das Antivirus-Programm mindestens täglich ein Update der Viruskennungen bekommt. Je mehr, desto besser.
  • Die meisten Schädlinge verbreiten sich über infizierte Webseiten. Die meisten Betreiber von Webseiten wissen das nicht einmal. Über eine Sicherheitslücke dringen Hacker in den Webserver ein und ergänzen die regulären Webseiten um "unsichtbaren" Inhalt, der über eine Sicherheitslücke im Browser oder in Flash/Java dann den eigenen PC infizieren kann. Deshalb: verwenden Sie Linux oder Apple oder einen unüblichen Browser.
  • Verwenden Sie nicht die browserbasierte ebanking-Variante, die Ihre Bank anbietet. Der Browser ist prinzipiell unsichere Software. Installieren Sie eine spezielle ebanking-Software, die mit HBCI arbeitet (z.B. das kostenlose Hibiscus, das es für Windows, Apple und Linux gibt). HBCI ist entweder mit einer speziellen Bankkarte möglich (sieht so aus wie eine Giro-/Kreditkarte mit Chip) oder mit Verschlüsselung über einen Datenträger (nannte sich früher "Diskette", geht mit USB-Stick genausogut). Die meisten Banken lassen sich HBCI mit Chipkarte jährlich bezahlen, HBCI mit Schlüsseldiskette ist i.a. kostenlos. Der Aufwand bei der Einrichtung ist etwas höher (man muss postalisch mit der Bank Verschlüsselungsinformationen austauschen, die sog. "öffentlichen Schlüssel").
  • Falls Sie eine HCBI-Karte haben, benötigen Sie einen Kartenleser. Nehmen Sie nicht das billigste Modell, sondern eines mit eigenem Display und eigener Tastatur (von Kobil oder ReinerSCT). Ansonsten kann ein Trojaner auf dem PC die Eingabe Ihrer PIN zur Karte abfangen - das ist natürlich nur dann ein Risiko, wenn die Originalkarte gestohlen wird. Achten Sie darauf, dass der Kartenleser mit Ihrem PC zusammen arbeitet (nicht jeder Kartenleser funktioniert mit Apple oder Linux).
  • Wenn es denn doch ebanking mit dem Browser sein soll, verwenden Sie nicht das TAN-Verfahren (auch wenn es iTAN oder mTAN ist). Derzeit vernünftig ist ein Verfahren, bei dem Sie von der Bank ein zusätzliches Gerät ("Token") bekommen, das eine Geheimnummer für jeden Vorgang erzeugt. Dieses Gerät dürfen Sie natürlich nicht verlieren oder in fremde Hände geben. Auch das Zusenden von TANs per SMS ist eine schlechte Idee, GSM, UMTS und LTE sind nicht sicher und können relativ problemlos abgehört werden. Außerdem könnte sich ein wirklich bösartiger, gewiefter Mensch eine doppelte SIM-Karte beschaffen und die SMS abfangen. Bis Anfang Juli gab es das bei unserer örtlichen Volksbank als Sonderaktion sogar kostenlos.
  • Das Verfahren mit einem zusätzlichen Gerät, das Geheimnummern erzeugt, bietet auch PayPal für kleines Geld an. Wenn Sie PayPal verwenden: unbedingt benutzen! Alternativ gibt es die Möglichkeit, diese Geheimnummern mit einer Android-App zu erzeugen. Das halte ich für fast genauso gut (wenn das Smartphone nicht infiziert wird).
  • Schalten Sie bei Google ebenfalls die zweistufige Authentisierung ein! Die Geheimnummern zur Anmeldung kommen dann entweder per SMS auf Ihr Handy, oder Sie verwenden die App Google Authenticator. Damit wird es deutlich schwerer, Ihr Google-Email-Konto zu kapern. Klicken Sie dazu in irgendeiner Google-App (Mail, Kalender, Google Plus etc.) auf Ihr Profilfoto rechts oben, dann auf "Konto", danach auf "Sicherheit" und dann auf "Bestätigung in zwei Schritten".
  • Den o.g. "Google Authenticator" kann man auch verwenden, um die zweistufige Anmeldung bei DropBox durchzuführen!
  • Richten Sie für alle Fälle eine zweite Emailadresse bei einem anderen Anbieter ein. Verwenden Sie diese Emailadresse zur Wiederherstellung Ihres "Erstkontos", wenn der schlimmste Fall eintrifft und jemand das Passwort irgendwie herausbekommen hat. Lassen Sie alle Benachrichtigungen über Passwortänderungen parallel auch an diese zweite Emailadresse senden!
  • Richten Sie zur Kontowiederherstellung Ihre Handynummer ein, so dass der Anbieter Ihnen eine SMS schicken kann. Dies geht nur vorbeugend, bevor das Kind in den Brunnen gefallen ist!
  • Ein exotischer Ratschlag, der eher für das berufliche Umfeld gilt: stecken Sie keine "gefundenen" oder fremden USB-Sticks in Ihren PC. Manche Firmennetze wurden auf diese Weise schon infiltriert, auch wenn die Firewalls noch so gut sind. Manche "USB-Sticks" sind komplette kleine PCs, die Ihr Opfer gezielt angreifen können und dort Schadsoftware einschleusen.
  • Wenn Sie ein Smartphone für Bankgeschäfte verwenden wollen, achten Sie auch hier auf die o.g. Sicherheitsvorkehrungen. Installieren Sie keine unbekannte Software.
  • Bei Android:
    * schalten Sie den USB-Debugging-Mode aus, wenn Sie ihn nicht brauchen.
    * Schalten Sie "Software aus unbekannten Quellen" aus.
    * Installieren Sie ein vertrauenswürdiges Antivirus-Programm, z.B. von Kaspersky, Sophos, Norton, AVG, Avast.
    * Installieren Sie keine Apps, die unnötige Rechte beanspruchen.
    * Verwenden Sie ein Kontrollprogramm wie SRT AppGuard.
  • Für Profis: lesen Sie den heise-Newsticker und die Mailingliste Full Dosclosure. Wenn Sie hier einige Wochen mitgelesen haben und immer noch gut schlafen können, sind Sie wirklich ein Profi! ;)
[Update 20130722: Tippfehler, Adblock Plus durch Adblock Edge ersetzt]
[Update 20180710: Adblock Edge durch uBlock origin ersetzt]

08.02.2013

Java JDK/JRE silent install Änderung mit 7u13

Kleine Überraschung mit Sun JDK 7u13.

Silent install funktioniert plötzlich nicht mehr wie bisher.

Mein Skript fliegt auf die Nase, und stattdessen kommt der Hilfebildschirm von msiexec ;(


Kommandozeile bislang:
jdk-bla.exe /S /V"InstallDir=bla usw."

Lösung: /V" ... " weglassen und den ganzen Schwanz von Parametern direkt in die Kommandozeile schreiben. Also:

jdk-bla.exe /S
InstallDir=bla ... usw.

So steht's geschrieben bei http://goo.gl/PaMz4

11.01.2013

Alle Java-Versionen per Skript deinstallieren

Aus der Abteilung "Skripte, die die Welt nicht braucht" anlässlich der wiederholten kritischen Sicherheitslücken in der Java Runtime hier ein Skript, mit dem man unter Windows sämtliche Versionen der JRE und JDK deinstallieren kann. Wie im Artikel berichtet, ist es nicht ganz einfach, die JRE nur im Browser abzuschalten, deshalb wird die komplette Deinstallation empfohlen, wenn man es nicht wirklich braucht.

Das Skript (cmd) ruft eine Hilfsfunktion in VBS auf, um die Registry nach dem Uninstall-Befehl zu durchsuchen; das VBS generiert gleich ein passendes Skript in cmd-Syntax, das dann vom Hauptskript aufgerufen wird.
Beide Skripte (uninstall-java.cmd und .vbs) kann man dann auf ein Netzlaufwerk legen oder mit einem USB-Stick von jedem betroffenen PC aus starten, um alle JRE- und JDK-Instanzen zu entfernen. Wenn auf dem Netzlaufwerk keine Schreibrechte sind, muss das .cmd leicht angepasst werden und die temporäre Datei z.B. in %TEMP% angelegt werden. Ich hab's in meinem Fall gern, dass die Uninstall-Befehle in diesem Verzeichnis bleiben.
[Update: die Schreibrechte werden im .cmd benötigt, nicht im .vbs]

uninstall-java.vbs

const HKEY_LOCAL_MACHINE=&H80000002
Set StdOut=WScript.StdOut
Set StdErr=WScript.StdErr

Set o=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

o.EnumKey HKEY_LOCAL_MACHINE, Key, SubKeys

For Each subkey In SubKeys
  o.GetStringValue HKEY_LOCAL_MACHINE,Key&"\"&subkey,"DisplayName",name
  name=" "&name
  if (Instr(name,"Development Kit")) Then
    StdErr.WriteLine "JDK "&name
  End If
  if (InStr(name,"Java(TM)") or InStr(name,"J2SE") or InStr(name,"Java ")) Then
  StdErr.WriteLine Key&"\"&subkey
    StdOut.WriteLine "@echo "&name
    o.GetStringValue HKEY_LOCAL_MACHINE,Key&"\"&subkey,"DisplayVersion",ver
    StdOut.WriteLine "REM "&subkey&" => JRE "&ver
    o.GetStringValue HKEY_LOCAL_MACHINE,Key&"\"&subkey,"UninstallString",uninst
    StdOut.WriteLine "REM "&uninst
    uninst=Replace(uninst,"/X","/passive /qb /X")
    uninst=Replace(uninst,"/I","/passive /qb /X")
    if (uninst <> "") Then
      StdOut.WriteLine uninst
    End If
  End If
Next

uninstall-java.cmd

@ECHO off
cd /D %~dp0
cscript //nologo //B uninstall-java.vbs > uninst-java-%COMPUTERNAME%.cmd 2> java-%COMPUTERNAME%.txt
call uninst-java-%COMPUTERNAME%.cmd

19.11.2012

Eclipse und Android - was man alles falsch machen kann

Heute mal was für Programmierer und solche, die es werden wollen ...
Wahrscheinlich amüsieren sich die Profis über meine ersten Stolperschritte mit einer neuen Eclipse-Installation. Ich hab's ja nicht so mit GUIs, ich bin ein reiner Kommandozeilenmensch ;)

Es war einmal ... ein Eclipse Indigo mit Android SDK auf einem WXP-System zur Entwicklung einer kleinen App für Android 2.2.
Android 2.2 als Target, weil sich exakt mit dieser Version das API für den Zugriff auf eine SD-Karte eingeführt wurde (getExternalFilesDir()).
Dann war lange Zeit Pause, weil die App einfach so fröhlich vor sich hin funktionierte.
Nach einem Jahr und etwas mehr war ich genervt von den neuen Android-Versionen, die an mir vorübergingen, weil Samsung keine Updates für die Galaxy-S-Geräte auf die Reihe bekam. Also Anschaffung Nexus7 und Galaxy Nexus ;), Verkauf Archos 101 (Android 2.2.1), Galaxy i9000 (2.3.3). Am Rand: Nexus7 seit 2 Tagen auf 4.2, GNexus noch auf 4.1.2.

Interessanterweise funktioniert die bisherige App für den Wetterauer Tiernotdienstkalender (aus dem Play Store) auch auf diesen Nexus-Geräten, die ja prinzipiell keine SD-Karten unterstützen (außer mit Tricks auf gerooteten Geräten und einem USB-OTG-Adapter ...).

Irgendwann kam ein neuer PC mit Linux (RHEL 6.3) und Eclipse Juno und die Lust, ein bißchen weiter an den bisherigen Apps zu basteln und auch mal am lang geplanten und siechenden Romanverwaltungsprogramm (für PR und die anderen Serien, die ich sammle) weiterzuschrauben.

Also:
  1. Eclipse Juno installiert
  2. Android SDK installiert
  3. Android plugin für Eclipse installiert
  4. Android SDK Manager zum Download diverser Google Images und APIs gestartet
  5. An diversen Permissions geschraubt, bis Eclipse, AVD und ADT als User (nicht root) funktionieren
  6.  Sourcen der Apps in den Eclipse-Workspace kopiert
  7. Freundliche Fehlermeldungen über R.java
  8. Clean Project
  9. R.java wird in gen/ nicht neu erzeugt ;(
  10. Fehlersuche bei stackoverflow.com und diversen anderen
  11. Alle Tipps der Reihe nach ausprobieren ...
  12. z.b. "manage imports" erzeugt immer wieder "import android.R;" (Erklärung dafür: das Android SDK stößt auf einen Fehler und bricht ab. R.java wird nicht erzeugt, deshalb bastelt Eclipse sich irgendwas zurecht ;( )
  13. z.b. "clean"
  14. z.b. "properties->android tools->fix project properties"
  15. z.b. "Build Path->Order"
  16. z.b. "per-project java build environment"
  17. Aus lauter Verzweiflung dann statt dem IBM JRE 1.6.0.11 noch Sun JDK 1.7.09 installiert und eclipse -vm /opt/jdk_1.7.0_09/jre/bin aufgerufen.
  18. z.b. Prüfen aller XML auf Korrektheit
  19. Im grafischen Editor für das UI fiel mir auf, dass nix angezeigt wurde, und zum ersten Mal wenigstens mit einem Hinweis: keine Version angegeben für Emulator!
  20. Also Preferences->Android aufgerufen
  21. Dort wurde nur Version 4.0.3 und 4.1.2 angezeigt, obwohl ich in der Zwischenzeit auch die benötigte 2.2 mit dem SDK Manager geladen hatte.
  22. Meine App hat aber minSdkVersion="8", also brauche ich Google API 8 zum Bauen.
  23. Android SDK Pfad neu gesetzt und Eclipse neu gestartet.
  24. Jetzt werden alle im SDK Manager geladenen Android-Versionen korrekt angezeigt. Bingo!
  25. Normalerweise kenne ich den "Neustarten"-Trick ja nur von Windows ;)
  26. Und die Moral von der Geschicht': man soll nicht Sachen parallel machen, hier Nachladen von Android-APIs mit dem SDK Manager und schon mit dem Entwickeln in Eclipse anfangen.
Des weiteren habe ich meinen Code etwas umgestellt, um sowohl mit Geräten ohne als auch solchen mit SD-Karte umzugehen.

Alt:
        public static void setDataDir(Context c) {
                if (okStorage()) {
                        DataDir = c.getExternalFilesDir(null).toString();
                        logger("setdatadir.ext", DataDir);
                } else {
                        logger("setdatadir.error", "no external storage");
                }
        }

        public static boolean okStorage() {
                StorageState = Environment.getExternalStorageState();
                if (Environment.MEDIA_MOUNTED.equals(StorageState)) {
                        StorageAvailable = StorageWriteable = true;
                } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(StorageState)) {
                        StorageAvailable = true;
                        StorageWriteable = false;
                } else {
                        StorageAvailable = StorageWriteable = false;
                }
                return StorageWriteable;
        }


Neu:
        public static void setDataDir(Context c) {
                if (okExtStorage()) {
                        DataDir = c.getExternalFilesDir(null).toString();
                        logger("setdatadir.ext", DataDir);
                } else {
                        DataDir = c.getFilesDir().toString();
                        StorageAvailable = StorageWriteable = true;
                        logger("setdatadir.int", DataDir);
                }
        }

        public static boolean okStorage() {
                return (DataDir != null);
        }

        public static boolean okExtStorage() {
                StorageState = Environment.getExternalStorageState();
                if (Environment.MEDIA_MOUNTED.equals(StorageState)) {
                        StorageAvailable = StorageWriteable = true;
                } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(StorageState)) {
                        StorageAvailable = true;
                        StorageWriteable = false;
                } else {
                        StorageAvailable = StorageWriteable = false;
                }
                return StorageWriteable;
        }