30 Tage Ernährung mit Bertrand… Tag 1

Der erste Tag mit Bertrand war ein recht spannender - schließlich wusste ich noch überhaupt nicht, was mich erwarten würde. Deshalb habe ich mir erstmal alles zurecht gelegt, um es vor Anwendung genau durchzulesen. Man benötigt Wasser, seine Tüte Bertrand, einen Löffel und seinen Mixer samt Shakerball.

Bertrand Bauteile

Bertrand Bauteile

Die Tüte lässt sich recht leicht an den vorbereiteten Markierungen aufreißen. Damit nicht das ganze Aroma verloren geht, hat jede Tüte nochmal einen Aromaverschluss, mit der man sie wieder für den Rest des Tages verschließen kann. Das ist recht praktisch, da man so den restlichen Inhalt nicht erst mühsam umfüllen muss.

Bertrand öffnen Bertrand öffnen Bertrand öffnen

Bertrand öffnen

Jetzt heißt es löffeln. Trotz der großen Öffnung des Shakers gehen die ein oder anderen Krümel daneben. Ein Trichter wäre aber wahrscheinlich trotzdem keine große Hilfe, da das Pulver eine gewisse Restfeuchtigkeit hat.

Bertrand löffeln

Bertrand löffeln

Etwa bis zur 275ml-Marke muss der Shaker mit Bertrand gefüllt werden - eigentlich sogar ein wenig mehr, da ansonsten am Ende des Tages zu viel Pulver übrig ist. Anschließend wird der Shakerball hinzugegeben, bevor alles mit Wasser aufgefüllt wird.

Bertrand zubereiten Bertrand zubereiten Bertrand zubereiten

Bertrand zubereiten

Anschließend heißt es dann Deckel drauf und ordentlich schütteln. Der Shakerball hilft dabei tatsächlich sehr, das Wasser und das Bertrand-Pulver zu vermengen. Das hätte ich mir definitiv schwieriger vorgestellt. Fertig ist das ganze im Grunde dann, wenn am Boden der Flasche kein Pulver mehr übrig ist, sondern sich alles gleichmäßig verteilt hat.

Bertrand schütteln

Bertrand schütteln

Fertig zubereitet riecht Bertrand angenehm nussig und schmeckt auch so. Die Konsistenz ist den Großteil der Zeit eher wässrig als matschig. Erst zum Ende der Flasche wird alles etwas zäher, da sich die festen Bestandteile recht schnell wieder am Boden absetzen. Nervig sind die etwas größeren Nussstücke, die einen zum Kauen animieren sollen. Die führen nämlich eher dazu, dass man seinen Mund mit der Zunge nach Nussstücken absucht, um sich nicht an ihnen zu verschlucken. Als Ersatzmahlzeit ist Bertrand sicherlich eine ordentliche Alternative verglichen mit irgendwelchem Fastfood.

Allerdings merke ich schon am ersten Tag, dass die Lust auf das Getränk von Mahlzeit zu Mahlzeit abnimmt. Ist es beim ersten Mal noch aufregend und neu, freut man sich nach dem dritten Mal bereits, dass man es erstmal "geschafft" hat. Obwohl ich Nüsse recht gern esse, ist es nicht sonderlich angenehm, permanent einen Nussgeschmack im Mund zu haben.

Angenehm wiederum ist, dass eine Flasche Bertrand für etwa 4-6 Stunden sättigt, auch wenn man nicht das Gefühl hat, wirklich satt geworden zu sein. Es ist eher ein leichtes keinen-Hunger-mehr-haben-Gefühl, durch das man einfach nur nicht mehr ans Essen denkt.

Mein erster Gesamteindruck ist, dass Bertrand für Zwischendurch ganz gut geeignet ist, man jedoch einiges an Entbehrungen auf sich nehmen müsste, um sich permanent ausschließlich davon zu ernähren. Ich denke deshalb, dass ich das Spielchen jetzt erst einmal eine Woche spielen werde, um dann zu sehen, ob ich nochmal Anpassungen am weiteren Verlauf vornehmen möchte. Es stehen ja noch weitere Geschmacksrichtungen, sowie Koch- und Saftexperimente an. 🙂

Nussige Grüße, Kenny

30 Tage Ernährung mit Bertrand… Tag 0

Seit ein paar Jahren gibt es einen Trend aus den USA, der Stück für Stück auch nach Deutschland schwappt - Soylent. Dabei handelt es sich um ein Nahrungspulver, das sämtliche Nährstoffe liefern soll, die der menschliche Körper benötigt. Das mit Wasser oder Säften vermischte Pulver, das anschließend getrunken wird, soll als vollständiger Nahrungsersatz fungieren können.

Da Soylent derzeit nicht in Europa verkauft wird, entstehen diesseits des Atlantik immer mehr Firmen, die ähnliche Produkte auf den Markt bringen. Neben einem Lizenzprodukt finden sich Ableger wie Bertrand, Huel, Jake, Joylent, Veetal und andere.

Durch einen Golem-Artikel wurde auch ich wieder auf das Thema aufmerksam und sah mir die Webseiten der verschiedenen Anbieter an. Die meisten von ihnen werben damit, eine vollwertige Nahrung anzubieten und präsentieren stolz die vielen natürlichen Zutaten, die sie verwenden. Erst im Kleingedruckten findet man heraus, dass neben den natürlichen Zutaten auch allerhand Vitamin- und Mineralienpulver hinzugefügt werden, um die Nährstofftabelle zu komplettieren. Besonders gruselig fand ich dabei das Original-Soylent aus den USA, das selbst vor dem Einsatz genmanipulierter Zutaten nicht zurückschreckt.

Das einzige Produkt, das mich persönlich überzeugt hat, ist Bertrand. Der Hersteller aus Deutschland wirbt damit, ausschließlich Zutaten aus ökologischem Anbau zu verarbeiten - hat hierfür auch ein Zertifikat - und damit, keinerlei Nährstoffzusätze zu verwenden. Dementsprechend klingt die Zutatenliste auch eher nach einem Müsli, als nach Astronautennahrung:

Klassisch. Version 2.5:
Vollkornhafer*, Rapsölpulver (auf Maltodextrin*), Magermilchpulver*, geriebene Mandeln*, Leinsamenmehl*, Rohrzuckerpulver*, Sonnenblumenkernmehl*, Walnussmehl*, Sanddornpulver*, Johannisbrotkernmehl, Kokosnusspulver*, Jodsalz, Trockenhefe*, Algenpulver (Porphyra)*, Pilzpulver* (Agaricus bisporus)

*aus kontrolliert ökologischer Landwirtschaft
Natürliches Vanillearoma und natürliches Heidelbeeraroma werden optional beigegeben

Das ganze hat dann allerdings auch seinen Preis: Für 90 Mahlzeiten (wobei sich jeweils 3 Mahlzeiten in einem Beutel befinden) bezahlt man 269€. Der Versand ist kostenlos und mit jeder größeren Bestellung erhält man einen Shaker gratis dazu, den man optional auch gegen einen weiteren Beutel Bertrand eintauschen kann.

Nach ein wenig hin und her überlegen, entschloss ich mich, eine Monatsration an Bertrand zu bestellen und zu versuchen, mich 30 Tage lang ausschließlich von dem Pulver zu ernähren. Die Bestellung selbst ging recht schnell von der Hand, allerdings dauerte der Versand eine halbe Woche.

Bertrandpaket auspacken Bertrandpaket auspacken Bertrandpaket auspacken
Bertrandpaket auspacken Bertrandpaket auspacken Bertrandpaket auspacken

Bertrandpaket auspacken

Etwas überrascht war ich von der Größe und dem Gewicht des Pakets und von der Größe der Tagesportionsbeutel. Ich war nicht davon ausgegangen, dass man jeden Tag 500g Pulver zu sich nehmen würde. Um mal ein Gefühl dafür zu bekommen, wie man sich einen 500g-Beutel vorstellen muss, habe ich einfach mal einen in die Hand genommen.

Größe einer Tagesportion

Größe einer Tagesportion

Positiv überrascht bin ich auch von der Qualität des Shakers. Für 11,90€ pro Stück kann man im Zuge seiner Bertrand-Bestellung auch noch weitere dazu kaufen. Ich bin gespannt, ob ich mit den beiden Shakern, die ich nun erst einmal besitze, über die Runden kommen werde oder ob es sinnvoll ist, noch mehr davon zu besitzen.

Verpackter Shaker

Verpackter Shaker

Damit mir durch den potentiell eintönigen Geschmack nicht allzu schnell die Lust vergeht, habe ich mir von allen drei Geschmacksrichtungen - natürlicher Geschmack, Vanillegeschmack und Heidelbeergeschmack - jeweils 10 Beuten bestellt. So kann ich ein wenig hin und her probieren. Außerdem werde ich mit den Beuteln mit der natürlichen Geschmacksrichtung auch ein wenig experimentieren. Beispielsweise wird vorgeschlagen, dass man ja auch mal Säfte statt Wasser für die Zubereitung verwenden kann.

Bertrand in drei Geschmacksrichtungen

Bertrand in drei Geschmacksrichtungen

Vorbereitend auf dieses Experiment habe ich mir natürlich auch überlegt, was mich wohl erwarten wird, wenn ich einen ganzen Monat lang Pulvernahrung zu mir nehme. Die Erwartungen habe ich in positive und negative Punkte getrennt und werde in wöchentlichen Folgeartikeln schreiben, inwieweit sich meine Erwartungen erfüllt haben.

Meine positiven Erwartungen drehen sich vor allem um die Erleichterungen:

  • + gesündere und ausgewogenere Ernährung
  • + keine Gedanken darüber, ob/was ich essen kann
  • + kürzere Wocheneinkäufe (Wasser, Säfte, Haushaltsbedarf)
  • + vereinfachte Essenszubereitung
  • + bessere Gewichtskontrolle durch Portionsbeutel
  • + mehr Freizeit, da nebenbei gegessen werden kann

Meine negativen Erwartungen drehen sich unter anderem darum, was man geschmacklich und sozial mit Essen verbindet:

  • - merkwürdiger/unangenehmer Geschmack
  • - langweiliges/eintöniges Essen
  • - Heißhunger auf anderes/richtiges Essen
  • - eklige/schleimige Konsistenz
  • - Diskussionen mit Freunden/Kollegen/Partner
  • - schwierige Reinigung des Shakers durch getrocknete Pampe
  • - nervige Umstellung der Verdauung
  • - soziale Events verleiten zu normalem Essen

Ich bin gespannt auf die nächsten Tage und Wochen und werde darüber berichten, wie es mir so ergeht. 🙂

Pulverige Grüße, Kenny

Aktive Verteidigung gegen Krypto-Trojaner

Mit Locky sieht die IT-Welt derzeit einen der koordiniertesten Trojanerangriff der jüngeren Zeit. Während er sich Anfangs als Schläfer getarnt haben soll, findet er inzwischen auf unterschiedlichsten Wegen sein Ziel: als Word- oder Excel-Dokument mit schädlichem Makro, als JavaScript-Datei - z.B. getarnt als angebliches Sipgate-Fax - oder gar als altmodische und ausgestorben geglaubte Batch-Datei. Bei den Opfern des Verschlüsselungstrojaners handelt es sich durchaus auch um größere Organisationen wie Krankenhäuser und ein Fraunhofer-Institut. Man ging zeitweise von 5000 Neuinfektionen pro Stunde aus.

Die Vorschläge für Gegenmaßnahmen sehen derzeit noch eher mager aus: die einen raten zur Symptombekämpfung durch Backups, deaktivierte Makros und Virenscannern, andere wiederum versuchen, durch das Erkennen der Funktionsweise des Trojaners (schnelles Bearbeiten vieler Dateien in kurzer Zeit) eine Anti-Malware-Software auf Heuristikbasis zu erstellen.

Um sich erfolgreich gegen solch einen Trojanerangriff zur Wehr zu setzen, muss man jedoch an mehreren Baustellen aktiv werden - und anstatt unterschiedlichste Teilmaßnahmen einzuführen, sollte man sich überlegen, welche Kombination von Maßnahmen zu einem ganzheitlichen Schutz führen kann. Die folgende Auflistung soll dabei eine kleine Hilfestellung für einen aktiven Umgang mit solch einem Infektionsrisiko bieten. Das folgende Dreiergespann aus Vermeidung, Erkennung und Behandlung ist auch in der Medizin durchaus weit verbreitet.

Zuerst einmal sollte man natürlich das Thema Vermeidung betrachten. Hierzu zählen Dinge wie das Deaktivieren der Makrofunktion in Office-Anwendungen, die Aufklärung von Mailnutzern darüber, dass Office-Anhänge von außen nicht zu öffnen und ZIP-Dateien von außen nicht zu entpacken sind. Auch das Deaktivieren von JavaScript auf exponierten Arbeitsplätzen oder gar der Wechsel auf ein Betriebssystem mit konsequenter Trennung von Ausführungsrechten und Dateinamen kann eine Option darstellen.

Anschließend sollte man sich darum kümmern, eine Erkennung eines erfolgreichen Angriffs zu ermöglichen. Erst, wenn eine Infektion erkannt werden kann, kann sie im Anschluss auch behandelt werden. Leider ist es noch häufig so, dass eine Erkennung lediglich durch Virenscanner erfolgt. Diese sind jedoch so spezifisch an einzelne Schädlinge und deren spezifisches Verhalten angepasst, dass neue Generationen häufig für längere Zeit unentdeckt bleiben. Anstatt Verhaltensmuster der Schädlinge zu untersuchen, ist es daher sinnvoller, Standardverhaltensmuster seiner Mitarbeiter zu aggregieren und Abweichungen von diesem Standardverhalten in einem Sicherheitsmonitoring zu sammeln. So ist es möglich, auch neue Schädlinge anhand eines vom Durchschnitt abweichenden Verhaltens zu erkennen, anstatt bereits im Voraus das Verhalten des Schädlings kennen zu müssen. Beispielsweise könnte zum Erkennen eines Krypto-Trojaners die durchschnittliche Anzahl an neu erstellten, bearbeiteten und gelöschten Dateien pro Tag herhalten. Während ein typischer Büroarbeiter eher selten viele Dateien gleichzeitig anlegt und gleichzeitig viele Dateien löscht, ist genau das das Hauptgeschäft von Krypto-Trojanern. Solch eine Erkennung von Abweichungen kann mit Canaries ergänzt werden. Dabei handelt es sich um Dateien, die extra als Opfer für einen Verschlüsselungstrojaner bereitgestellt werden und deren Bearbeitung als ein eindeutiges Indiz für das Vorhandensein eines Krypto-Trojaners dienen kann. Das Ziel der Erkennung ist es, von einem Problem zu erfahren, noch bevor der Nutzer etwa Ungewöhnliches feststellt.

Abschließend muss das Thema der Behandlung betrachtet werden. Hierzu zählen an erster Stelle regelmäßige Backups. Das häufig kommunizierte Mantra, Dateien auf einem externen Datenträger zu sichern und diesen anschließend wieder vom Computer zu trennen, stellt in den meisten Umgebungen keinen ausreichenden Schutz dar. Denn während des Backups kann auch der externe Datenträger befallen und verschlüsselt werden. Der eigentliche Wunsch hinter solch einer Aussage ist vielmehr, eine Sicherung zu erstellen, die von einer eventuellen Infektion nicht beeinflusst werden kann. Sinnvolle Varianten können hierbei extern durchgeführte Backups sein, die nicht vom infizierten Nutzer angestoßen und demnach auch nicht vom infizierten Nutzer modifiziert werden können. Auch lokale Backups unter der Hoheit eines anderen Systemnutzers stellen eine Möglichkeit dar. Noch sinnvoller als ein einfaches Backup ist jedoch eine Versionierung, die zwar mehr Speicherplatz benötigt, dafür aber auch eine selektive Wiederherstellung von Dateiinhalten unterschiedlichster Zeitpunkte ermöglicht.

Die Implementierung eines entsprechenden Schutzes ist auch mit einfachen Tools möglich - auch, wenn speziell entwickelte Werkzeuge wesentlich mehr Komfort bieten. Im Folgenden soll eine Erkennung und Behandlung eines Krypto-Trojaner-Angriffes mit Hilfe von Mercurial dargestellt werden. Wie Mercurial für das Erkennen von unspezifischen Angriffen auf Server zum Einsatz kommen kann, hatte ich bereits vor einiger Zeit schon einmal demonstriert.

Anbei einmal ein beispielhaftes Script zur Erkennung von Abweichungen in der Bearbeitung von Dateien. Das Script ermittelt Abweichungen von der durchschnittlichen Menge an erstellten/gelöschten/bearbeiteten Dateien. Zudem prüft es separat die Veränderung eines Canaries. Das Script ist nur als Proof-of-Concept eines dateiorientierten host-based, anomality-based Intrusion Detection Systems zu verstehen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#!/usr/bin/php
<?php
  // user-defined values
  define("CHECKFOLDER", "/testpit/");
  define("CHECKCANARY", CHECKFOLDER . "data/do-not-edit.txt");
  define("STATUSFILE",  CHECKFOLDER . "status/status");

  // deviation of user behaviour from previously collected behaviour
  define("DEVIATIONVALUE", 0.5); // default deviation of 50% is allowed

  // generated values
  define("CHECKDATE", date("Ymd-His"));

  // concatenated actions
  define("ADDREMOVECMD", "hg addremove -R "" . CHECKFOLDER . "" -X "" . CHECKCANARY . """);
  define("COMMITCMD",    "hg commit -R "" . CHECKFOLDER . "" -X "" . CHECKCANARY . "" -m "" . CHECKDATE . """);
  define("STATUSCMD",    "hg status -R "" . CHECKFOLDER . """);

  // static definitions
  define("ADDEDHINT",     "A");
  define("MISSINGHINT",   "!");
  define("MODIFIEDHINT",  "M");
  define("NOTTRACKEDHINT","?");
  define("REMOVEDHINT",   "R");

  define("HINTDELIMITER",       " ");
  define("STATISTICSDELIMITER", ":");

  function check_filename($line, $filename) {
    $result = false;
   
    $parts = explode(HINTDELIMITER, $line, 2);
    if ((false !== $parts) && (2 === count($parts))) {
      $result = (0 == strcasecmp(CHECKFOLDER . $parts[1], $filename));
    }

    return $result;
  }

  function check_hint($line, $hint) {
    $result = false;

    $parts = explode(HINTDELIMITER, $line, 2);
    if ((false !== $parts) && (2 === count($parts))) {
      $result = (0 == strcasecmp($parts[0], $hint));
    }

    return $result;
  }

  function get_statistics_text($additions, $deletions, $modifications) {
    return (CHECKDATE . STATISTICSDELIMITER . ADDEDHINT . STATISTICSDELIMITER . $additions .
                        STATISTICSDELIMITER . MODIFIEDHINT . STATISTICSDELIMITER . $modifications .
                        STATISTICSDELIMITER . REMOVEDHINT . STATISTICSDELIMITER . $deletions);
  }

  function check_statistics($additions, $deletions, $modifications) {
    $result = true;

    // with any modification there's nothing to check
    if (0 < ($additions + $deletions + $modifications)) {
      // read statistics and execute statistics checkvg_additions_count     = 0;
      $avg_additions_count     = 0;
      $avg_additions_value     = 0;
      $avg_deletions_count     = 0;
      $avg_deletions_value     = 0;
      $avg_modifications_count = 0;
      $avg_modifications_value = 0;

      if (is_file(STATUSFILE)) {
        $statistics = file(STATUSFILE, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        if ((false !== $statistics) && (0 < count($statistics))) {
          // calculate average additions, deletions and modifications from statistics data
          foreach ($statistics as $line) {
            $parts = explode(STATISTICSDELIMITER, $line, 7);
            if ((false !== $parts) && (7 === count($parts))) {
              // check if value is integer and bigger than 0
              if (is_numeric($parts[2]) && (0 < $parts[2])) {
                $avg_additions_value += $parts[2];
                $avg_additions_count++;
              }
              if (is_numeric($parts[6]) && (0 < $parts[6])) {
                $avg_deletions_value += $parts[6];
                $avg_deletions_count++;
              }
              if (is_numeric($parts[4]) && (0 < $parts[4])) {
                $avg_modifications_value += $parts[4];
                $avg_modifications_count++;
              }
            }
          }
        }
      }

      // there's nothing wrong when nothing happened
      if (0 < $additions) {
        // when actions has never been seen then that's a deviation
        if (0 === $avg_additions_count) {
          $result = false;
        } else {
          // more additions than expected
          if (((1.0 + DEVIATIONVALUE) * ($avg_additions_value / $avg_additions_count)) < $additions) {
            $result = false;
          }
        }
      }

      // there's nothing wrong when nothing happened
      if (0 < $deletions) {
        // when actions has never been seen then that's a deviation
        if (0 === $avg_deletions_count) {
          $result = false;
        } else {
          // more deletions than expected
          if (((1 + DEVIATIONVALUE) * ($avg_deletions_value / $avg_deletions_count)) < $deletions) {
            $result = false;
          }
        }
      }

      // there's nothing wrong when nothing happened
      if (0 < $modifications) {
        // when actions has never been seen then that's a deviation
        if (0 === $avg_modifications_count) {
          $result = false;
        } else {
          // more modifications than expected
          if (((1 + DEVIATIONVALUE) * ($avg_modifications_value / $avg_modifications_count)) < $modifications) {
            $result = false;
          }
        }
      }
    }
   
    // add new result to statistics
    file_put_contents(STATUSFILE,
                      get_statistics_text($additions, $deletions, $modifications) . "\n",
                      FILE_APPEND | LOCK_EX);

    return $result;
  }

  function main() {
    $additions     = 0;
    $deletions     = 0;
    $modifications = 0;

    $canary_found = false;

    // retrieve information about file changes
    exec(STATUSCMD, $output);

    // accept file changes right away
    exec(ADDREMOVECMD);
    exec(COMMITCMD);

    // iterate through file changes
    foreach ($output as $line) {
      // check if the canary file is part of the modifications
      if (check_filename($line, CHECKCANARY)) {
        $canary_found = true;
      } else {
        // check if a file has been added
        if (check_hint($line, ADDEDHINT) || check_hint($line, NOTTRACKEDHINT)) {
          $additions++;
        } else {
          // check if a file has been deleted
          if (check_hint($line, MISSINGHINT) || check_hint($line, REMOVEDHINT)) {
            $deletions++;
          } else {
            // check if a file has been modified
            if (check_hint($line, MODIFIEDHINT)) {
              $modifications++;
            }
          }
        }
      }
    }

    if (0 < ($additions + $deletions + $modifications)) {
      // accept file changes
      exec(ADDREMOVECMD);
      exec(COMMITCMD);
    }

    // print result
    print(get_statistics_text($additions, $deletions, $modifications) . "\n");

    // the canary has been modified
    if ($canary_found) {
      //!!! do something
      print("ALERT! CANARY HAS BEEN MODIFIED!\n");
    }

    // check if the modifications do not match the statistics
    if (!check_statistics($additions, $deletions, $modifications)) {
      //!!! do something
      print("ALERT! BEHAVIOUR DOES NOT MATCH STATISTICS!\n");
    }
  }

  // execute application
  main();

?>

Bei jedem Aufruf ermittelt das Script mit Hilfe von Mercurial, welche Dateien in einem Repository/Ordner hinzugefügt, entfernt oder bearbeitet wurden. Sollte sich darunter die Canary-Datei befinden, wird Alarm geschlagen. Zudem wird eine statistische Analyse durchgeführt. In diesem einfachen Beispiel gilt als Abweichung, wenn mehr als 150% der durchschnittlichen Dateioperationen erkannt wurden. Wird solch eine Abweichung erkannt, wird ebenfalls Alarm geschlagen. Durch die Verwendung von Mercurial ließen sich zudem zu jeder Zeit alle bearbeiteten Dateien rekonstruieren.

In einem realen Umfeld könnte solch eine Analyse natürlich noch viel tiefergreifend sein. So könnten beispielsweise folgende Prüfungen mit einfließen, um Anomalien besser erkennen zu können:

  • Es könnte die Uhrzeit der Dateibearbeitung mit in die Analyse einfließen. In Kombination mit der Auswertung von Arbeitsplänen und/oder Anwesenheitszeiten ließen sich bessere Modelle erstellen. So sollte es seltener der Fall sein, dass Dateien eines Mitarbeiters bearbeitet werden, der gar nicht anwesend ist.
  • Es könnte die Relation der Dateibearbeitungen untereinander betrachtet werden. Beispielswiese werden Büromitarbeiter wesentlich mehr Dateien erstellen und bearbeiten als löschen, da Arbeitsergebnisse selten wieder vernichtet werden.
  • Es könnte das ursprüngliche Dateidatum mit berücksichtigt werden. Beispielsweise ist es eher unüblich, dass Dateien ab einem bestimmten Alter noch einmal bearbeitet werden. Stattdessen werden sie eher als Referenz vorgehalten, anstatt als aktives Arbeitsdokument zu fungieren.

Je besser das erstellte Modell ist, mit dem das Verhalten der Systemnutzer abgeglichen wird, desto schneller erkennt man in Ausnahmesituationen einen potentiellen Angreifer. Nicht immer müssen das externe Angreifer sein. Auch interne Mitarbeiter, die ein ungewöhnliches Verhalten in den Tag legen, können auf diese Weise unter Umständen identifiziert werden - es muss nicht einmal zwingend eine böse Absicht hinter diesem Verhalten stecken, evtl. stellt ein Mitarbeiter einfach eine Ausnahme zur üblichen Regel dar.

Generell sollte man sich bei solch einer Angriffserkennung auf Basis von Abweichungsermittlungen daran gewöhnen, auch mal False Positives zu erhalten. Diese sind durchaus wünschenswert, da sie einerseits zeigen, dass die durchgeführten Analysen tatsächlich einen Effekt haben und einem andererseits Verbesserungspotentiale in den erstellten Anomaliemodellen aufzeigen. 🙂

Verteidigende Grüße, Kenny

3D-Barcodes mit Farbfiltern auslesen…

Bereits vor einer ganzen Weile hatte ich mal mit Licht und Farbfiltern herum experimentiert. Damals hatte ich mit Hilfe von Farbfiltern das Licht aufgespalten, das von einer RGB-LED emittiert wurde und dabei auch erwähnt, dass man auf Basis dieser Bündelung Daten übertragen könne.

Einige Zeit später war ich auf der Suche nach einer Möglichkeit, Binärdaten über ein Druckerzeugnis zu übertragen. Dabei denkt man heutzutage natürlich erst einmal an 2D-Barcodes (z.B. Aztec-Codes, Matrix-Codes oder die allseits bekannten QR-Codes). Leider reichte deren Datendichte nicht aus. In ähnlichen Fällen werden deshalb gelegentlich 3D-Barcodes (z.B. der HCCB-Code von Microsoft) einsetzt. Diese funktionieren, indem neben den Dimensionen Höhe und Breite noch die Dimension der Farbe eingeführt wird (in animierten Medien kann noch die vierte Dimension der Zeit eingeführt werden). Allerdings benötigen solche 3D-Barcodes typischerweise mehrere Dinge:

  • Eine Lizenz, um das Verfahren nutzen zu dürfen.
  • Stark angepasste Lesegeräte und/oder Erkennungsalgorithmen.

In dem Moment dachte ich an das Experiment mit den Farbfiltern zurück. Wenn man es hinbekäme, die Komplexität des Barcode-Lesens und die Komplexität des gesteigerten Farbraums voneinander zu trennen, könnte man einfach reproduzierbare Barcodes erzeugen, die gleichzeitig primär mit vorhandenen Standardmitteln lesbar wären. Geboren war der kombinierte Farb-Barcode...

kombinierter Farb-Barcode

kombinierter Farb-Barcode

Herstellen lässt er sich recht einfach:

  1. Man nimmt sich zwei normale 2D-Barcodes und legt diese übereinander.
  2. Pixel, die in beiden Barcodes vorkommen, werden schwarz gefärbt.
  3. Pixel, die in keinem der beiden Barcodes vorkommen, werden weiß gefärbt.
  4. Pixel, die nur im ersten Barcode vorkommen, werden mit einer Farbe A eingefärbt.
  5. Pixel, die nur im zweiten Barcode vorkommen, werden mit einer Farbe B eingefärbt.

Gedanken machen muss man sich nun darum, wie man die Barcodes wieder getrennt bekommt - dafür ist es wichtig, Farbe A und Farbe B richtig zu wählen. Diese beiden Farben müssen eine Beziehung zueinander haben, die sich wie folgt beschreiben lässt:

  • Wenn Farbe A durch einen Farbfilter der Farbe B betrachtet wird, muss ein möglichst starker Farbkontrast entstehen.
  • Wenn Farbe B durch einen Farbfilter der Farbe A betrachtet wird, muss ein möglichst starker Farbkontrast entstehen.

Glücklicherweise hatte ich Farbfilter zuhause, die diese beiden Bedingungen erfüllen - rote und blaue.

roter und blauer Farbfilter

roter und blauer Farbfilter

Wichtig für einen produktiven Einsatz ist es, dass die Farbfilter und die für den Druck verwendeten Farben aufeinander abgestimmt werden. Im Haushaltsgebrauch wird man das nicht unbedingt hinbekommen, weshalb das Auslesen des Barcodes im selbstgebastelten Umfeld wohl mehr Geduld erfordert, als es im professionellen Umfeld der Fall wäre.

gedruckter Barcode

gedruckter Farb-Barcode

Um nun den Inhalt der Barcodes lesen zu können, macht man einfach folgendes: Man platziert einen Farbfilter vor der Kamera und scannt den Code. Anschließend tauscht man den Farbfilter vor der Kamera aus und scannt den Code erneut ("shuttern"). Eine Alternativmöglichkeit ist, zwei Kameras gleichzeitig zu verwenden, die statische Farbfilter verwenden - so ist es möglich, trotz doppelter Datendichte die Lesegeschwindigkeit konstant zu halten.

Barcode mit Farbfilter Barcode mit Farbfilter

Farb-Barcode mit Farbfilter

Wie man erkennt, geschehen beim Aufnehmen des Barcodes nun zwei vier Dinge:

  • Schwarze Pixel bleiben unverändert und stellen die Kontrastfarbe dar.
  • Weiße Pixel werden eingefärbt und stellen die Grundfarbe dar.
  • Pixel in der Farbe des Filters werden herausgefiltert und stellen die Grundfarbe dar.
  • Pixel in der Gegenfarbe des Filters werden verstärkt und stellen die Kontrastfarbe dar.

Durch Einsatz der Farbfilter und dem Effekt der Kontraständerung der Gegenfarbe entstehen zwei unterschiedliche Barcode-Abbildungen auf Basis eines einzigen Farb-Barcodes. Jeder QR-Code-Leser, der einen automatischen Kontrastabgleich vornimmt, kann diese Barcodes bereits lesen.

Bei der Barcode-Erkennung können nach dem Einsatz des Filters noch zwei Schritte unternommen werden, um das Leseergebnis zu verbessern. Im ersten Schritt kann eine Überführung in ein Graustufenbild erfolgen, um den Bias des Farbsensors abzumildern. Wie man in den Ausgangsbildern erkennt, ist der Kontrast im Blaufilter-Bild wesentlich schlechter erkennbar als im Rotfilter-Bild.

Farb-Barcode mit Farbfilter als Graustufenbild Farb-Barcode mit Farbfilter als Graustufenbild

Farb-Barcode mit Farbfilter als Graustufenbild

Im zweiten Schritt kann mit Hilfe eines Schwellwertabgleichs der tatsächlich benötigte Inhalt gut gefiltert werden. GIMP bietet hierfür beispielsweise ein einfach zu verwendendes Werkzeug, das einem eindeutig anzeigt, welche Schwellwerte von Interesse sind.

Schwellwertabgleich Schwellwertabgleich

Schwellwertabgleich

Die daraus entstehenden Barcodes sollten nun wirklich von jedem Barcode-Scanner gelesen werden können:

Farb-Barcode mit Farbfilter als Graustufenbild nach Schwellwertfilter Farb-Barcode mit Farbfilter als Graustufenbild nach Schwellwertfilter

Farb-Barcode mit Farbfilter als Graustufenbild nach Schwellwertfilter

Um zu zeigen, dass das Auslesen auch mit Standardmitteln funktioniert, habe ich den prototypischen Versuch (zuhause ausgedruckter Farb-Barcode + iPhone + vorgehaltener Filter + App aus dem App-Store) einfach mal per Video aufgezeichnet. Ja, es funktioniert nicht perfekt, aber weder Licht, Druckerfarbe, Farbfilter noch verwendete App sind in irgendeiner Art aufeinander abgestimmt. Das sollte man beim Betrachten des Videos im Hinterkopf behalten. 🙂

Einsatz finden kann solch ein Verfahren in meinen Augen in zwei Situationen:

  • In Situationen, in denen in einem Barcode mehr Daten gespeichert werden müssen, als in einen konventionellen Barcode passen.
  • In Situationen, in denen in einem Barcode Daten für mehrere Empfänger gespeichert werden sollen. Möglich wäre beispielsweise das Szenario, dass zwei Verarbeitungsschritte Informationen aus einem Barcode lesen sollen. Der Barcode-Leser des ersten Verarbeitungsschritts erhält einen blauen Farbfilter, dessen zu lesende Daten werden in rot encodiert. Der Barcode-Leser des zweiten Verarbeitungsschritts erhält einen roten Farbfilter, dessen zu lesende Daten werden in blau encodiert. Bei gut abgestimmten Filtern und Druckfarben sind die Barcode-Leser nun optisch nicht mehr in der Lage, die falschen Daten vom Farb-Barcode auszulesen.

barcode_gruesse

Passwort-Reset in WordPress deaktivieren

Immer wieder findet man vermeindliche Kleinigkeiten, mit denen man sich noch besser gegen Angreifer schützen kann. Einer dieser blind Spots war bei mir bisher die Passwort-zurücksetzen-Funktion meiner Webseiten. WordPress liefert hier leider keine einfache Konfigurationseinstellung, um sie zu deaktivieren.

Da ich in meinem Fall neben dem WordPress-Nutzer auch gleichzeitig der Serveradmin bin und mir direkt auf der Kommandozeile ein neues Passwort verpassen kann, benötige ich den Weg über eine Passwort-Reset-E-Mail gar nicht und kann diese Funktion auch genauso gut abschalten. So besteht nicht mehr die Gefahr, dass meine Webseiten durch gehijackte E-Mail-Accounts kompromittiert werden können.

Hierfür notwendig ist ein winziges Plugin, das man sich schnell selbst zusammenschreiben kann. Der Inhalt kann wie folgt aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
  /*
    Plugin Name: KillPWReset
    Description: Disables the Password Reset in WordPress.
    Version: 0.1c1
  */


function killpwreset_disable($userid) {
  return false;
}

function killpwreset_errortext($errortext) {
  return "Login failed.";
}

add_filter("allow_password_reset", "killpwreset_disable");
add_filter("login_error",          "killpwreset_errortext");
?>

Der Code sorgt dafür, dass für sämtliche Nutzer der Passwort-Reset deaktiviert wird (man kann es auch per User-ID steuern (z.B. nur Gäste, aber keine Admins). Weiterhin sorgt er dafür, dass eine generische Fehlermeldung erzeugt wird, wenn ein Login fehlschlägt. Typischerweise ist in der Fehlermeldung die Passwort-Reset-Funktion mit verlinkt. So wird der Fehlertext samt Link einfach überschrieben.

Deaktivierte Grüße, Kenny

Seite 3 von 88« Erste...234...Letzte »