SommerCampus 2006 :: Linux/Unix system programming


Die Welt der Systemprogrammierung unter Unix ist sehr groß und kann sehr komplex werden. Für Anfänger oder nicht erfahrene Benutzer kann es deshalb schwierig werden, in die Systemprogrammierung einzusteigen, und manchmal ist es notwendig systemnah zu programmieren oder man will einfach mehr über das System lernen.

Dieser Kurs wird sich mit der Programmiersprache C befassen, da die meiste Systemprogrammierung unter Unix auf C basiert und die Systemfunktionen in C geschrieben sind (das heißt aber nicht, dass man C++ nicht benutzen kann).

Tag 01

Tag 02

Tag 03

Tag 04

SommerCampus CRON Projekt sc-cron

Download:
sc-cron-0.0.1.tar.gz [146K] (Diese Version ist ungepatch und enthält eine absichtliche Sicherheitslücke)
sc-cron-0.0.2.tar.gz [146K]
save-exec.patch

Vorwort

Dieses Projekt soll als Beispiel für die Anwendungen der Kentnisse dienen, die während des Kurses vermittelt wurden. Deswgen ist dieser Mini Cron Server nicht besonder leistungsfähig, was das Parsen von Crontabs anbetrifft. Aber wenn man den Code durchliest, vermittelt er vielleicht gute Erkentnisse, wie man an die Unix Systemprogrammierung herangeht, insbesondere auf die Behandlung von fork Prozessen und die Vermeidung von Zombie-Prozessen, Syslog Meldungen und das Empfangen und Versenden von Signalen.

ACHTUNG!!!

Benutze diesen Mini Cron Server nur zu Testzwecken, du darfst ihn NIEMALS so ohne Patches in einer Produktiv Maschine einsetzen, wo mehrere Benutzer Zugriff haben! Denn sc-crontab stellt ein Backdoor für Cracker dar, mit dem man sehr schnell an Root Rechten kommen kann.

Dieses Backdoor wurde absichtlich von mir eingerichtet, damit man als Programmierer sehen kann, wie gefährlich eine Datei mit Besitzer root und mit gesetztem setuid-Bit sein kann, und dass man sehr vorsichtig sein muss, wenn die Binary das gesetzte setuid-Bit braucht. Diese Lücke ist in der Version 0.0.1 enthalten; die Version 0.0.2 hat diese Lücke beseitigt, es wäre also auch gut, wenn man beide Versionen vergleicht!

Es liegt nun an dir die Quelle des Fehlers (Fehler in Makefile.am und sc-crontab.c) zu erkennen und diesen zu beheben, es gibt mehrere Möglichkeiten diesen Fehler los zu werden. Denk drüber nach. Vielleicht kommst du selber drauf, wenn du dir folgendes exploit anschaust:

Exploit
supertux@supertux:~> cat mybash 
#!/bin/bash
 
echo program executes: $0 $@
 
/bin/bash --login
supertux@supertux:~> EDITOR=/home/supertux/mybash sc-crontab
program executes: /home/supertux/mybash /var/spool/sc-cron/tmp/supertux
root@supertux:~> whoami
root

Installation

Installation
$ tar xpzf sc-cron-0.0.2.tar.gz
$ cd sc-cron-0.0.2
$ ./configure --prefix=/usr --localstatedir=/var/spool/sc-cron \ 
  --with-pid-file=/var/run/sc-cron.pid
$ make && make install
$ cp support/sc-cron.init /etc/init.d/sc-cron

Dienst starten (als root)
root ~ $ /etc/init.d/sc-cron start
starting sc-cron...

Benutzer dürfen sc-crontab aufrufen und nur ihre eigene Cron Jobs eintragen und löschen. Nur root darf Cron Jobs von andere Benutzern editieren/löschen. Angenommen, ich woll folgendes als supertux einfügen:

Cron jobs hinzufügen
supertux@supertux:~> sc-crontab
# Editor aus ${EDITOR} wird gestartet, erst beim
# Beenden und Abspeichern werden die Cron Jobs gespeichert
# und im Server aktualisiert
 
# crontab format
# minute hour day month command
# Use * instead of numbers, if you want that e.g.
# that all minutes on the minute field match
 
# führe das jede Minute aus
* * * * echo Hallo | mailx -s "`date`" supertux
 
# leider ist sowas wie bei Vixie-Cron nicht möglich,
# da der Parses sehr einfach ist (soll nur ein Beispiel
# für einen CRON Server dienen)
# 0,5,15,20 * * * command
 
# schreibe in $HOME `date` um 01:16, 01:18, 01:20
16 1 * * date >> ~/mydate.txt
18 1 * * date >> ~/mydate.txt
20 1 * * date >> ~/mydate.txt
 
#editor verlassen, Nachricht kommt:
Your cronjobs were successfully saved. Installing the cron jobs ... successfull

Einige Minuten später
# um 01:22
supertux@supertux:~> cat mydate.txt 
Tue Aug 22 01:16:00 CEST 2006
Tue Aug 22 01:18:00 CEST 2006
Tue Aug 22 01:20:00 CEST 2006
supertux@supertux:~> pine
+ N   8 Aug 22 To: supertux@supertux.homelinux.org
+ N   9 Aug 22 To: supertux@supertux.homelinux.org
+ N  10 Aug 22 To: supertux@supertux.homelinux.org
+ N  11 Aug 22 To: supertux@supertux.homelinux.org
+ N  12 Aug 22 To: supertux@supertux.homelinux.org
+ N  13 Aug 22 To: supertux@supertux.homelinux.org
+ N  14 Aug 22 To: supertux@supertux.homelinux.org

Und wenn man den Dienst beenden will

Dienst stop (als root)
root ~ $ /etc/init.d/sc-cron stop
stopping sc-cron...

Valid XHTML 1.0 Strict   Valid CSS!