Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von Martin Kattmann -
Anzahl Antworten: 12
Schönen guten morgen zusammen,

aus mir bisher unerklärlichen Gründen ist ein Backup sowie Restore einzelner Kurse auf unserer Moodle-Instanz nicht mehr möglich. Was mich am meisten dabei wundert ist, dass keinerlei Rückmeldung von Moodle erfolgt sowie keine Einträge - laut des Providers - in den Apache-Logfiles zu finden sind. ,-(

Ich hoffe Moodle hat keinen "nachurlaublichen Ärger-Mechanismus" eingebaut, der - weil ich mich die letzten drei Wochen weit ab von der digitalen Welt vergnügt habe - ein wenig foppen will ,-) Vorher funktioniert es nämlich noch alles wunderbar.

Folgendes Szenario bietet sich mir:
Egal ob ich mit Nutzerdaten, Kursdateien oder Logfiles den Kurs speichern möchte erhalte ich nach klicken des weiter-Buttons ein
ordentliche Zusammenfassung der Sicherungsdetails. Wenn ich jedoch dann erneut auf "weiter" klicke bekomme ich keinen Verarbeitungsprozess etc.
angezeigt sondern nur einen schmalen weißen Balken (Siehe Grafik).
kurssicherung-fehlerseite
Selbst mit eingeschalteten Debugmodus "Alle" erhalte ich die selbe Anzeige.

Weitere vergebliche Versuche und Informationen ...
- im Verzeichnis moodledata/temp/backup befinden sich keine alten Dateien oder Reste davon
- die Kursraumgröße variert zwischen 200KB und 85MB (Ich hatte leider auch kein Erfolg bei kleineren Kursen ,-(
- eine Kurssicherung ist auf einer anderen Moodle-Instanz (gleiche Moodle-Version, jedoch geringer Größe) auf dem gleichen Server möglich!
- die automatischen Backups werden durchgeführt.
- ein Restore bereits gesicherter Backups lässt sich nicht durchführen. Ähnlich wie beim Backup wird mir nach der Anzeige der Sicherungsdetails und des klicken des weiter-Buttons ein leere Seite angezeigt.
- max_execution_time 300,
- memory_limit 128M,
- der MySQL-Dump ist ca. 105MB groß,
- es handelt sich um eine Moodle-Instanz der Version 1.8.4 (2007021540).

Mein einziger verbleibender Ansatz ist ein Upgrade unserer Moodle-Version auf 1.8.6 durchzuführen und zu hoffen, dass dann wieder alles funktioniert.

Besten Dank für Eure Mühe schonmal im voraus!

Sonnigen Gruß aus Theesen

Martin
Mittelwert:  -
Als Antwort auf Martin Kattmann

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von klal klal -

hallo martin,

schauen sie einmal nach, ob im moodle dateisystem eine datei verändert wurde. beispielsweise die moodlelib.php. dann könnten solche "erscheinungen" auftreten, ohne dass die log- files etwas anzeigen.

hg, fre

Als Antwort auf klal klal

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von Martin Kattmann -
Hallo fre,

besten Dank für den herrlichen Tipp! Die moodlelib.php hat anscheinend wirklich etwas damit zu tun.

Nachdem ich testweise die vorhandene Datei durch eine ältere gesicherte Version ersetzt hatte, funktioniert die Kurssicherung wieder!

Ich habe Beide (alte und aktuelle) moodlelib.php-Dateien einmal mit einem sehr feinen Texteditor auf deren Unterschiede hin untersucht - Text-Diff-Werkzeug von PSPad.

Ergebnis war, dass die Zeile 299 sowie 334 folgenden zusätzlichen Code enthält:
 $param = preg_replace("/eval|system|passthru|exec|include|require_once|move_uploaded_file/i", "", $param);

Nach meinem Wissen ist allerdings nur das Feedback-Modul in letzter Zeit installiert und sonst keine Veränderungen am Moodle-System vorgenommen worden. Nun frage ich mich ...
a) welche Prozesse verändern die moodlelib.php bzw. war es das Feedback-Modul und sollte ich es wieder entfernen?
b) kann ich einfach die alte Version weiterverwenden ohne weiteren Schaden anzurichten?

Freundliches winken

Martin Kattmann

---- Schnipp - Ausschnitt moodlelib.php ----
/// PARAMETER HANDLING ////////////////////////////////////////////////////
 /**
 * Returns a particular value for the named variable, taken from
 * POST or GET. If the parameter doesn't exist then an error is
 * thrown because we require this variable.
 *
 * This function should be used to initialise all required values
 * in a script that are based on parameters. Usually it will be
 * used like this:
 * $id = required_param('id');
 *
 * @param string $parname the name of the page parameter we want
 * @param int $ty$param = preg_replacepe expected type of parameter
 * @return mixed
 */
function required_param($parname, $type=PARAM_CLEAN) {
 // detect_unchecked_vars addition
 global $CFG;
 if (!empty($CFG->detect_unchecked_vars)) {
 global $UNCHECKED_VARS;
 unset ($UNCHECKED_VARS->vars[$parname]);
 }
 if (isset($_POST[$parname])) { // POST has precedence
 $param = $_POST[$parname];
 } else if (isset($_GET[$parname])) {
 $param = $_GET[$parname];
 } else {
 error('A required parameter ('.$parname.') was missing');
 }
 $param = preg_replace("/eval|system|passthru|exec|include|require_once|move_uploaded_file/i", "", $param);
 return clean_param($param, $type);
}
 /**
 * Returns a particular value for the named variable, taken from
 * POST or GET, otherwise returning a given default.
 *
 * This function should be used to initialise all optional values
 * in a script that are based on parameters. Usually it will be
 * used like this:
 * $name = optional_param('name', 'Fred');
 *
 * @param string $parname the name of the page parameter we want
 * @param mixed $default the default value to return if nothing is found
 * @param int $type expected type of parameter
 * @return mixed
 */
function optional_param($parname, $default=NULL, $type=PARAM_CLEAN) {
 // detect_unchecked_vars addition
 global $CFG;
 if (!empty($CFG->detect_unchecked_vars)) {
 global $UNCHECKED_VARS;
 unset ($UNCHECKED_VARS->vars[$parname]);
 }
 if (isset($_POST[$parname])) { // POST has precedence
 $param = $_POST[$parname];
 } else if (isset($_GET[$parname])) {
 $param = $_GET[$parname];
 } else {
 return $default;
 }
 $param = preg_replace("/eval|system|passthru|exec|include|require_once|move_uploaded_file/i", "", $param);
 return clean_param($param, $type);
}
--- Schnapp ---
Als Antwort auf Martin Kattmann

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von klal klal -

hallo,

schauen sie einmal nach, ob sie eine zusätzliche datei z.b. licence.php am server haben. dann könnte ihr system gehackt worden sein.

hg, fre

Als Antwort auf klal klal

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von Martin Kattmann -
Schönen guten Abend fre,

das sind ja nicht allzu gute Nachrichten! Ihr zweiter Tipp war auch wieder ein Treffer. Es befindet sich im Root-Verzeichnis der betroffenen Moodle-Instanz eine license.php mit der Größe 4.844KB (09.09.2008 - 1946 Uhr) und diese wurde ein Tag früher als die moodlelip.php (10.09.2008 12:02 Uhr) verändert.

Andere Moodle-Instanzen auf dem gleichen Server scheinen aber - nach einem ersten Blick - nicht betroffen zu sein.

Die große Frage bleibt allerdings bestehn: Was soll mach ich denn nu? Welches Vorgehen ist bei einem solchen Fall mit Erfolg gekrönt?

Ein Upgrade auf die neueste 1.8.x Version wird das Problem wohl nicht beheben, oder?

Vielen Dank für alles schonmal!

Besten Gruß

Martin Kattmann


Als Antwort auf Martin Kattmann

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von Martin Kattmann -
Schönen guten Tach zusammen,

heute morgen sieht die Welt schon ganz anders aus und ich wollte meine Frage mal ein wenig präzisieren bzw. für Leute mit ähnlichen Problemen beschreiben, wie ich momentan vorgehe.

* Aktuelle Rechte angepasst:
- Alle Passwörter für die globale Rolle Admin geändert.
Interessant ist, dass das einige Profil-Felder vom Admin fehlen, wie auch z.B. das Passwort-Feld. Ich habe mir dann mit einem Skript weitergeholfen - Siehe Forumsbeitrag
http://moodle.org/mod/forum/discuss.php?d=18103
Das Profil-Feld verweist übrigens auf /user/view.php?id=382&course=1 - müsste da nicht id=1 stehen?!
- die globale Rolle Gast (root@localhost) habe ich rausgeschmissen

* Restore eingeleitet
Den Provider habe ich gebeten ...
a) den Ordner /moodle/ nach veränderten Dateien zu durchsuchen. Bisher hatte ich folgende veränderte Dateien gefunden:
- admin/auth.php (10.09.2008- 23:25 - 11.740KB)
- lib/moodlelib.php (10.09.2008- 12:02 - 234.224KB)
- login/change_password.php (10.09.2008- 23:25 - 4.243KB)
- license.php (4.844KB - wurde neu angelegt)
b) eine Einspielung der betroffenen Ordner und der Datenbank neben der noch laufenden Moodle-Instanz vorzunehmen.
Ich war mir allerdings unsicher bezüglich des Zeitpunktes. Ich habe ihn gebeten ein Backup zu nehmen, welches zeitl. der ersten veränderte Datei (10.09.2008) am nächsten ist. Gibt es da Bedenken? Ist das ok?

* Was noch erfolgt ist, ...
- eine Änderung der FTP- und MySQL-Zugangsdaten
- eine genaue Analyse der Apache- sowie Moodle-Logfiles! Gibt es hierfür Tipps, worauf man achten sollte? Ich würde vor allem schauen, welche Benutzer sich eingeloggt haben und diese bitten ihre Passwörter - in der wiederhergestellten Moodle-Instanz - neu zu setzen.
- ...
Wenn Ihr noch Tipps habt, was beachtet werden sollte, dann "gerne und viel" bzw. immer man her damit!

* CHECKSUM
Gibt es evtl. ein Programm oder ein Logfile, wo die checksum installierter Dateien gelistet ist und/oder einen von Veränderungen informiert?

* Hack-Methode
Kennt jemand dieses Vorgehen und kann eine Einschätzung geben, wie schlimm dieser Angriff ist bzw. worauf es der/die Angreifer/in abgesehen hat?

Freundliches winken und besten Gruß

Martin Kattmann


Als Antwort auf Martin Kattmann

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von Peter Sereinigg -
Hack as Hack can ....
Jeder Hack (!) ist schlimm, denn ein Externer bekommt so fast uneingeschränkten Zugang auf einen Server.
Das Problem von Günstiganbietern ist der mangelnde Schutz und meist auch die nicht Trennbarkeit von Accounts und das Kleingedruckte in AGBs und die Tatsache, dass Siherheitswissen meist eher geringer ist.
Dh. http//www.ihredomain.xx/programm1 und http//www.ihredomain.xx/programm2 hängen oft über gemeiname Rootverzeichnisse zusammen. Das bedeutet, wer sich den Zugang zu einem Programm verschafft, kontrolliert alles ab dem Root. Wie es dazu kommt, zB wird ein Bild hochgeladen in einer Gallerie, die so genial ausieht und damit Löcher aufreißt.
Moodle im Core ist sicher - soweit etwas sicher sein kann, NUR das heißt die wichtigten Sicherheitsupdates IMMER sofort ausführen, publizierte Lücken die nicht geschlossen werden, sind Einladungen.

Gemeinsam mit Petr Skoda haben wir vor einiger Zeit begonnen als Dienstleistung Third-Party Produkte, Integrationen, Systeme speziell auf Moodle und Sicherheit zu überprüfen. So darf zB auf den edumoodle.at Server kein Modul, das nicht so zertifiziert wurde.

Im weltweiten Moodlepartnernetzwerk ist Sicherheit ein Topthema und wir stellen diese Informationen und Dienstleistungen unseren Kunden zur Verfügung (alle anderen können auf moodle.org natürlich auch alles nachlesen, die Partner/Experten-Diskusionen im Hintergrund dazu aber nicht!)
Unsere Server sind zB nur über VPN erreichbar, was das hacken noch weiter erschwert und trennen Anwendungen streng von gleichen Roots. Open Source heißt nicht unsicher, da der offene Code genau die Sicherheit bietet, um vorbeugend agieren zu können.
Profesionelle Nutzer und Anbieter tun gut daran sich hier Strategien und externe Kompetenzen zu sichern. Die Moodlepartner stehen hier gerne zur Verfügung.
Grüße aus Klagenfurt

Peter Sereinigg

p.s.: warum so wenig passiert .. sagen wir es so, niemand redet gerne darüber wenn es seinen Server erwischt ... wir haben da schon öfters geholfen ...
Als Antwort auf Peter Sereinigg

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von Maik Riecken -
Hallo,

Ich finde den Hinweis auf die Moodlepartner immer wieder richtig und wichtig, da gerade diese Netzwerke maßgeblich die Weiterentwicklung Moodles ermöglichen.

Als Moodlepartner muss man sich in Punkto Sicherheitsvorkehrungen mit Angeboten messen können, die in der gleichen Preisliga wie die eigenen Angebote angesiedelt sind. Und dann dürfte das Schwarzbrot in dieser einen Hinsicht extrem hart werden.

VPN und BSD-Jails bzw. vergleichbare Techniken (die trotzdem vor Sicherlücken im Moodlecode aber so gar nicht schützen - da hilft dann nur ein zusätzliches Backupkonzept) würde ich in dem Preisgefüge von Kiloeuro/Jahr nicht als Besonderheit ansehen, sondern erwarten, ebenso wie SLAs und brauchbare Verfügbarkeitsgarantien (ab 99,x%).

Ich kenne "Billiganbieter", die das auch sehr gut lösen können, da sich über eigene RZ-Stellflächen oder gar ein eigenes AS verfügen. Beides habe ich bisher nicht unbedingt bei jedem Moodlepartner "erscannen" können.

Ich möchte festhalten, dass Moodlepartner eine gute Wahl sind, weil sie z.B. moodlebezogenen Support, die komplette Technik u.v.m. bieten. Gleichzeitig hätte Moodle es ohne die Moodlepartner viel schwerer. Deswegen gebührt dem Partnernetzwerk Respekt und Dank.

Ich möchte aber auch festhalten, dass es möglich ist, Moodle günstiger und sicherer bei anderen Anbietern zu hosten, wenn man nicht ganz auf den Euro schaut.

Gruß,

Maik
Als Antwort auf Martin Kattmann

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von klal klal -

hallo,

schön, dass das problem gefunden ist.

ich denke doch, dass ein update auf das neueste moodel 1.8.6 bspw. etwas in punkto sicherheit bringt.

hg, fre

Als Antwort auf Martin Kattmann

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von Maik Riecken -

Hallo,

Die Fakten sehen wie folgt aus:

  • der Angreifer konnte unbemerkt auf dein Dateisystem zugreifen und Code verändern
  • damit sind ihm mit Sicherheit auch die Zugangsdaten zu deiner MySQL-Datenbank bekannt

Der Angreifer kann auf verschiedene Weisen in dein System gelangen. Da die Problematik schon öfter aufgetreten ist, liegt der Schluss nahe, dass das kein gezielter, sondern ein automatisierte Angriff gewesen ist, der Sicherheitslücken im Moodlecode ausnutzt und z.B. über die Filefunktionen von Moodle Dateien austauscht. Dagegen kann kein Provider dieser Welt etwas tun - auch kein Moodlepartner. Das Feedbackmodul hat den Securitytest der Community bestanden.

Bei einem erfolgreichen Angriff ist die Forensik sehr wichtig, d.h. man muss den "kompromittierten Zustand" einfrieren und genau analysieren (lassen), damit man erkennt, wie der Angreifer vorgegangen ist und wann er gekommen ist, weil er sonst auf einfache Weise wiederkommen kann. Das "wann" ist deswegen so wichtig, weil man nur so feststellen kann, bis wann die Backupdaten sauber sind.

Nach einem solchen Angriff gilt:

Du kannst dem System nicht mehr trauen. Einen Rootserver setzt man z.B. nach jedem Angriff und abgeschlossener Forensik komplett neu auf.

Das würde ich auch für dein System empfehlen, d.h. alle Kurse händisch sichern, neu installieren (Datenbankpasswort ändern!).

Viele präventive Massnahmen wurden bereits genannt:

  1. Den Code aktuell halten, Securitymails lesen (erhält nan, wenn man sein System registriert hat)
  2. Keine Third-Party-Module einsetzen! (Ausnahmen bisher: Feedback & Bock)

Ich habe damals bei Moodleschule wöchentliche, teilweise auch kürze Updates gefahren genau aus diesem Beweggrund.

Serverseitig:

  1. mod_php nur via su_exec!
  2. besser: php als (fast)cgi
  3. noch besser: bsd-jails oder Vollvirtualisierung zur Abschottung
  4. Backupstrategie (extern, nicht auf dem Server, nicht im selben Rechenzentrum)
  5. mod_security oder einen anderen Inputfilter
  6. Reverse Proxy (zusätzliche Authentifizierunghürde, Performancegewinn usw.)

Alles das hilft nicht gegen Lücken im Code! Nahezu jedes PHP-Projekt hatte eine Sicherheitsvorgeschichte. Das alles gilt demnach genauso für Joomla!, Wordpress etc.

Gruß,

Maik 

Als Antwort auf klal klal

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von Jörg Weißenhorner -
Hallo,

wie kommt man ausgerechnet auf den Namen licence.php? Sind solche Fälle irgendwo beschrieben?

Grüßle
Jörg
Als Antwort auf Martin Kattmann

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von cecilia dal bon -

Hi...I'm italian and I don't understand any german but I think I had your same problem with the file moodlelib.php. I couldn't backup and restore any course then I restored an old copy of the file moodlelib.php and it worked.

I found out that the lines were added in the "not working" file....

Nut i don't understand why they were added...hackers or installing new modules or blocks?

 $param = preg_replace("/eval|system|passthru|exec|include|require_once|move_uploaded_file/i", "", $param);  return clean_param($param, $type);

thank for any explanation you could give me Cecilia Dal Bon

Als Antwort auf cecilia dal bon

Re: Kurssicherung (+ Restore) bricht ohne Fehlermeldung ab

von Martin Kattmann -
Hi cecilia dal bon,

i'm sorry to tell you that no new module or block is the problem. I think that your Moodle-Instance was hacked.

In my case the hackers changed five files:
- admin/auth.php
- lib/moodlelib.php
- login/change_password.php
- lang/en_utf8/calendar.php
- license.php (that file was created by the hackers)

It seems that nothing else was changed and that it was an automatised attack. Probably google had been scanned for typical moodle-Scripts including possibly insecure php-code. Than an automatic attack and the thereby found PHP-Code was used to change these files for later use.

The extensive solution:
How Maik Riecken says, it would be best to install a completely new Moodle-version - if possible the whole Server.

The fast solution (if you need time to think about the other one) would be to upgrade to the newest version like 1.8.6.

Hope that helps you.

Good luck to you and your Moodle!

Martin Kattmann