<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NF.sec - Linux Security Blog</title>
	<atom:link href="http://nfsec.pl/feed" rel="self" type="application/rss+xml" />
	<link>http://nfsec.pl</link>
	<description>Network Access to Reserved Files Security jest blogiem zajmującym się podstawowym bezpieczeństwem w Internecie.</description>
	<lastBuildDate>Wed, 09 May 2012 21:01:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Czytając Darwina &#8211; Mac OS X od kuchni z DTrace</title>
		<link>http://nfsec.pl/techblog/4015</link>
		<comments>http://nfsec.pl/techblog/4015#comments</comments>
		<pubDate>Wed, 09 May 2012 21:01:22 +0000</pubDate>
		<dc:creator>Patryk Krawaczyński</dc:creator>
				<category><![CDATA[Techblog]]></category>
		<category><![CDATA[10.5]]></category>
		<category><![CDATA[10.6]]></category>
		<category><![CDATA[10.7]]></category>
		<category><![CDATA[dtrace]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[hfs+]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[lion]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[snow leopard]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://nfsec.pl/?p=4015</guid>
		<description><![CDATA[O d wersji 10.5 &#8222;Leopard&#8221;, Mac OS X posiada zestaw narzędzi o nazwie DTrace (ang. Dynamic Tracing Framework), który służy do analizy wydajności oraz rozwiązywania problemów z systemem. Zestaw ten dostarcza dane m.in dla narzędzi Apple Instruments, czy pozwala na wykorzystanie różnego rodzaju programów, które w rzeczywistości są skryptami DTrace. Autorem DTrace, jak i DTraceToolkit [...]]]></description>
			<content:encoded><![CDATA[<p><span class="capital">O</span></p>
<p>d wersji 10.5 &#8222;Leopard&#8221;, Mac OS X posiada zestaw narzędzi o nazwie <a href="http://dtrace.org/blogs/about/" title="DTrace" target="_blank" class="extlink" rel="nofollow">DTrace</a> (ang. <em>Dynamic Tracing Framework</em>), który służy do analizy wydajności oraz rozwiązywania problemów z systemem. Zestaw ten dostarcza dane m.in dla narzędzi <a href="http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/Conceptual/InstrumentsUserGuide/CreatingaCustomInstrument/CreatingaCustomInstrument.html#//apple_ref/doc/uid/TP40004652-CH4-SW1" title="Creating Custom Instruments with DTrace" target="_blank" class="extlink" rel="nofollow">Apple Instruments</a>, czy pozwala na wykorzystanie różnego rodzaju programów, które w rzeczywistości są skryptami DTrace. Autorem DTrace, jak i <a href="http://www.brendangregg.com/dtrace.html#DTraceToolkit" title="DTraceToolkit" target="_blank" class="extlink" rel="nofollow">DTraceToolkit</a> jest <a href="http://www.brendangregg.com/" title="Brendan Gregg" target="_blank" class="extlink" rel="nofollow">Brendan Gregg</a>. Firma Apple po prostu dostosowała je do swojego systemu i umieściła jako standardowy pakiet oprogramowania Mac OS X.<br />
<span id="more-4015"></span><br />
Jak zaznacza sam autor DTrace może zostać wykorzystany, głównie do odpowiedzi na dwa pytania: <em>- dlaczego mój Mac jest taki powolny?</em> oraz <em>- dlaczego mój wentylator zaczął tak głośno chodzić?</em> W przeciwieństwie do DTrace &#8211; standardowe narzędzia do analizy, jak <strong>Monitor Aktywności</strong> (ang. <em>Activity Monitor</em>) oraz <strong>top</strong>(1) nie zawsze potrafią dostarczyć kluczowych informacji na temat aktywności programów w systemie np. jak wiele czasu procesora zajmują krótko żyjące procesy; które procesy powodują największe zużycie I/O dysku; ile czasu zajmuje odczyt / zapis danego procesu na dysku itd. Poniżej przedstawiam krótką listę i działanie niektórych skryptów DTrace:</p>
<p><b>1.</b> <code>iosnoop</code></p>
<p>- narzędzie to służy do &#8222;śledzenia&#8221; I/O dysku. Za każdym razem, kiedy operacja I/O się zakończy &#8211; na wyjściu programu wyświetlany jest wiersz z podsumowaniem całego procesu:</p>
<pre>
darkstar:~ root# iosnoop
      UID  PID D    BLOCK   SIZE   COMM PATHNAME
160951430  366 R 48634712   4096  iTerm ??/com.googlecode.iterm.savedState/window_2.data
160951430  366 R 48634696   8192  iTerm ??/com.googlecode.iterm.savedState/window_2.data
160951430  366 W 48634712   4096  iTerm ??/com.googlecode.iterm.savedState/window_2.data
160951430  366 W 48634848  28672  iTerm ??/com.googlecode.iterm.savedState/window_2.data
160951430  366 W 48634904   4096  iTerm ??/com.googlecode.iterm.savedState/windows.plist
160951430  280 W 46685144  16384  Google Chrome ??/Default/Current Session
160951430  280 W 48635248 106496  Google Chrome ??/Default/.com.google.Chrome.zuK91F
    0        1 W 48048904  12288  launchd ??/T/etilqs_hF8gPlcMjfI2taD
    0        1 W 55170792   4096  launchd ??/asl/2012.04.30.U160951430.asl
    0        1 W 55171216   4096  launchd ??/asl/2012.04.30.U160951430.asl
    0        1 W 40742344   4096  launchd ??/log/system.log
    0        1 W 19899032   4096  launchd ??/asl/StoreData
</pre>
<p>Pozwala to na ciągłe monitorowanie aplikacji, które używają dysku oraz jakie pliki są przez nie czytane lub zapisywane. Operacje I/O na normalnych dyskach obrotowych nadal są wąskim gardłem w wydajności sprzętowej dlatego programy, które bardzo często żądają dostępu do danych (15 razy lub więcej na sekundę) mają prawo czasami wolniej wykonywać swoje funkcje ze względu na oczekiwanie na zakończenie <a href="http://pl.wikipedia.org/wiki/Operacja_wej%C5%9Bcia_wyj%C5%9Bcia_na_sekund%C4%99" title="IOPS" target="_blank" class="extlink" rel="nofollow">operacji zapisu/odczytu</a>. Prezentowane powyżej kolumny oznaczają kolejno: UID = użytkownik, PID = identyfikator procesu, D = rodzaj operacji (R = odczyt / W = zapis), BLOCK = położenie na dysku, SIZE = wielkość procesowanych danych w bajtach, COMM = nazwa procesu, PATHNAME = końcowa część ścieżki do pliku. W powyższym przykładnie została przyłapana przeglądarka Google Chrome na zapisywaniu bieżącej sesji <code>??/Default/Current Session</code>. Jeśli zależy nam na bardziej szczegółowej analizie możemy wykorzystać parametry &#8222;<code>-stoD</code>&#8222;, które zwrócą timestamp&#8217;y każdego startu i końca operacji I/O wyrażone w microsekundach &#8211; plus opis kilku innych typów operacji również z informacjami czasowymi:</p>
<pre>
darkstar:~ root# iosnoop -stoD
STIME       TIME        DELTA  DTIME  UID  PID D    BLOCK  SIZE     COMM PATHNAME
4149708383  4149709133  750    768      0    1 W 41878792  4096  launchd ??/Cache/data_1
</pre>
<p><b>2.</b> <code>hfsslower.d</code></p>
<p>- skrypt ten tak naprawdę jest odpowiedzą na pytanie: <em>- dlaczego iosnoop nie widzi wszystkich operacji I/O, jakie zachodzą na dysku?</em> Odpowiedź jest prosta: w celu zwiększenia wydajności system plików zawsze będzie starał się cachować jak najwięcej danych w pamięci RAM. Czasami aplikacja wykonując operację odczytu &#8222;myśli&#8221;, że wykonuje odczyt z dysku &#8211; a tak naprawdę operacja ta jest wykonywana z bardzo szybkiej pamięci. Zapisy również mogą być buforowane w pamięci, a dopiero później zapisana wraz z innymi buforami na dysk, co również przyśpiesza działanie aplikacji. Skrypt <code>hfsslower.d</code> mierzy operacje I/O zanim zostaną one przetworzone przez system plików <a href="http://pl.wikipedia.org/wiki/HFS%2B" title="HFS Plus" target="_blank" class="extlink" rel="nofollow">HFS+</a>, a <code>iosnoop</code> mierzy je dopiero po przetworzeniu ich przez system plików i tylko jeśli dotrą do dysku. Dlatego można powiedzieć, że <code>hfsslower.d</code> jest w stanie zobaczyć znacznie więcej, w tym odzwierciedlić rzeczywistą wydajność aplikacji ze względu na pomiary opóźnienia, na które ona bezpośrednio cierpi. W dodatku <code>hfsslower.d</code> potrafi dostarczyć informacji o tym, że nie tylko wolne operacje I/O są powodowane przez dysk, ale na przykład może wystąpić zjawisko zakleszczenia w systemie plików (zjawisko to występuje kiedy jeden z procesów lub wątków przed uzyskaniem dostępu do zasobu próbuje uzyskać <a href="http://pl.wikipedia.org/wiki/Blokada_%28informatyka%29" title="Blokada" target="_blank" class="extlink" rel="nofollow">blokadę</a> tego zasobu, która jest trzymana przez inny proces lub wątek). Skrypt ten pochodzi z <a href="http://www.dtracebook.com/" title="DTrace Book" target="_blank" class="extlink" rel="nofollow">książki DTrace</a> i nie jest uwzględniony standardowo w dystrybucji systemu, dlatego można go ściągnąć <a href="http://dtracebook.com/index.php/File_System:hfsslower.d" title="hfsslower.d" target="_blank" class="extlink" rel="nofollow">stąd</a> i przegrać z prawami 755 do katalogu <code>/usr/local/bin</code>. Jako argument może przyjąć liczbę określającą minimalną liczbę milisekund jaką zajęła operacja I/O:</p>
<pre>
[agresor@darkstar ~]$ sudo hfsslower.d 1
TIME                 PROCESS          D   KB     ms FILE
2012 May  1 13:33:46 esets_daemon     R    0     56 cursor.pdf/..namedfork/rsrc
2012 May  1 13:33:46 esets_daemon     R    4      7 cursor_1only_.png
</pre>
<p>Dlatego, jeśli użyjemy argumentu <b>0</b> będziemy w stanie śledzić każdą operację. Prezentowane powyżej kolumny oznaczają kolejno: TIME = czas zakończenia operacji I/O, PROCESS = nazwa aplikacji, D = rodzaj operacji (R = odczyt / W = zapis), KB = rozmiar operacji w Kilo Bajtach, ms = opóźnienie I/O w milisekundach, FILE = nazwa pliku, na którym wykonywana jest operacja.</p>
<p><b>3.</b> <code>execsnoop</code></p>
<p>- polecenie to śledzi wykonywanie nowych procesów. Szczególnie przydaje się w przypadku identyfikacji procesów o krótkim czasie życia tj. ich uruchomienie i zakończenie jest zbyt szybkie, aby wychwyciły je narzędzia typu <b>top</b> oraz <b>Monitor Aktywności</b>. Na przykład procesy te są uruchamiane podczas wykonania polecenia: <code>ls man</code>:</p>
<pre>
[agresor@darkstar ~]$ sudo execsnoop -v
STRTIME                UID    PID   PPID ARGS
2012 May  4 17:34:31 160951430    410     59 SFLSharedPrefsTo
2012 May  4 17:34:37 160951430    411    389 login
2012 May  4 17:34:37 160951430    412    411 bash
2012 May  4 17:34:37 160951430    414    413 path_helper
2012 May  4 17:34:42 160951430    415    412 man
2012 May  4 17:34:43 160951430    415    412 man
2012 May  4 17:34:43 160951430    415    412 man
2012 May  4 17:34:43 160951430    415    412 man
2012 May  4 17:34:43 160951430    416    415 sh
2012 May  4 17:34:43 160951430    416    415 gzip
2012 May  4 17:34:43 160951430    417    415 sh
2012 May  4 17:34:43 160951430    417    415 gzip
2012 May  4 17:34:43 160951430    425    424 less
2012 May  4 17:34:43 160951430    421    419 tbl
2012 May  4 17:34:43 160951430    426    422 troff
2012 May  4 17:34:43 160951430    423    420 sh
2012 May  4 17:34:43 160951430    423    420 gzip
2012 May  4 17:34:43 160951430    422    419 groff
2012 May  4 17:34:43 160951430    427    422 grotty
</pre>
<p>Prezentowane powyżej kolumny oznaczają kolejno: STRTIME = znacznik czasowy, UID = ID użytkownika, PID = ID procesu, PPID = ID rodzica procesu, ARGS = nazwa procesu (wyświetlane powinny być również argumenty przekazywane do procesów, ale nie działa to jeszcze w Mac OS X &#8211; więcej informacji na ten temat dostarcza <code>pr_psargs</code> w <code>/usr/lib/dtrace/proc.d</code>).</p>
<p><b>4.</b> <code>opensnoop</code></p>
<p>- pozwala na śledzenie plików, które są otwierane podczas uruchamiania programu. Pozwala to na wychwycenie różnego rodzaju błędów konfiguracyjnych, które zawierają złe ścieżki dostępu lub szczegółowo sprawdzić, co się dzieje podczas uruchamiania aplikacji:</p>
<pre>
[agresor@darkstar ~]$ sudo opensnoop -ve
STRTIME                UID   PID COMM          FD ERR PATH
2012 May  5 20:30:21     0   41 mds            9   0 .
2012 May  5 20:30:21     0  462 dtrace         6   0 /etc/localtime
2012 May  5 20:30:22     0  463 launchdadd     3   0 /dev/dtracehelper
2012 May  5 20:30:22     0  463 launchdadd     5   0 /var/db/launchd.db/com.apple.launchd
2012 May  5 20:30:22     0  463 launchdadd     6   0 /var/db/launchd.db/com.apple.launchd
2012 May  5 20:30:22     0  463 launchdadd     5   0 /usr/libexec
2012 May  5 20:30:22     0  463 launchdadd     5   0 /usr/libexec/launchdadd
2012 May  5 20:30:22     0   41 mds            9   0 .
2012 May  5 20:30:22    89  308 mdworker       9   0 /Library/PrivilegedHelperTools
2012 May  5 20:30:28     0  276 esets_daemon  15   0 /etc/localtime
2012 May  5 20:30:28     0  276 esets_daemon  15   0 /etc/localtime
</pre>
<p>Prezentowane powyżej kolumny oznaczają kolejno: STRTIME = znacznik czasowy, UID = ID użytkownika, PID = ID procesu, COMM = nazwa procesu / polecenie, FD = deskryptor pliku (-1 oznacza błąd ścieżki dostępu), ERR = kod błędu (szczegóły <code>/usr/include/sys/errno.h</code>), PATH = ścieżka dostępu.</p>
<p><b>5.</b> <code>dtruss</code></p>
<p>- poprzednie dwa narzędzia &#8211; <code>opensnoop</code> oraz <code>execsnoop</code> działały na podstawie śledzenia konkretnych wywołań systemowych. Wywołanie systemowe (ang. <em>system call</em> lub <em>syscall</em>) jest tym, o co aplikacja prosi jądro systemu operacyjnego kiedy przychodzi do wykonania uprzywilejowanego zadania, stworzenia procesu, operacji na plikach lub inne operacje I/O (dyskowe lub sieciowe). Wywołania systemowe są świetnym celem do analizy dla DTrace, ponieważ ich badanie często potrafi dostarczyć niezbędnych informacji (liczbę bajtów, nazwy plików i procesów, kody błędów, opóźnienia) o poczynaniach aplikacji. Narzędzie dtruss śledzi wszystkie rodzaje wywołań systemowych, co jest bardzo przydatne przy ogólnie pojętym debugowaniu (szczególnie, że Mac OS X tak naprawdę nie posiada typowego tracer&#8217;a syscall&#8217;i jak Linux &#8222;<strong>strace</strong>&#8221; lub Solaris &#8222;<strong>truss</strong>&#8222;). Jedną z zalet dtruss jest to, że może on śledzić kilka procesów w tym samym czasie &#8211; poprzez dopasowanie po nazwie procesu (opcja <code>-n</code>). Na przykład śledzenie przeglądarki Firefox po nazwie jej pliku binarnego:</p>
<pre>
[agresor@darkstar ~]$ sudo dtruss -n firefox-bin
	PID/THRD  SYSCALL(args) = return
  531/0x3738:  issetugid(0x100000000, 0x7FFF5FBFFDC9, 0x7FFF5FBFFC00) = 0 0
  531/0x3738:  csops(0x0, 0x0, 0x7FFF5FBFF84C) = 0 0
  531/0x3738:  shared_region_check_np(0x7FFF5FBFD798, 0x2, 0x55) = 0 0
  531/0x3738:  pread(0x3, "\312\376\272\276\0", 0x1000, 0x0) = 4096 0
  531/0x3738:  pread(0x3, "\317\372\355\376\a\0", 0x1000, 0x1000) = 4096 0
  531/0x3738:  mmap(0x100005000, 0x3000, 0x5, 0x12, 0x3, 0x100001F) = 0x5000 0
  531/0x3738:  mmap(0x100008000, 0x1000, 0x3, 0x12, 0x3, 0x100001F) = 0x8000 0
  531/0x3738:  mmap(0x100009000, 0x2C70, 0x1, 0x12, 0x3, 0x100001F) = 0x9000 0
  531/0x3738:  fcntl(0x3, 0x2C, 0x7FFF5FBFC678) = 0 0
  531/0x3738:  close(0x3) = 0 0
  531/0x3738:  stat64("/\0", 0x7FFF5FBFD2F0, 0x6) = 0 0
  531/0x3738:  getattrlist("/Applications\0", 0x7FFF684DC6F0, 0x7FFF5FBFD380) = 0 0
  531/0x3738:  getattrlist("/Applications/Firefox.app\0", 0x7FFF684DC6F0, 0x7FFF5FBFD380)
</pre>
<p>Ekran wyjściowy oczywiście jest znacznie dłuższy ze względu na wykonywanie bardzo dużej ilości wywołań. Jeśli ominiemy opcję <code>-n</code> &#8211; spowodujemy, że dtruss sam uruchomi wybraną aplikację i rozpocznie jej śledzenie. Dzięki wielu innym opcją możemy na przykład dodać znaczniki czasowe (<code>-e</code>), śledzić podprocesy (<code>-f</code>), sprawdzić ilość wywołań systemowych (<code>-c</code>) oraz wiele innych. <a href="http://tinyclouds.org/" title="Ryan Dahl" target="_blank" class="extlink" rel="nofollow">Ryan Dahl</a> (twórca <a href="http://nodejs.org/" title="node.js" target="_blank" class="extlink" rel="nofollow">node.js</a> używał tak często narzędzia <code>dtruss</code>, że wprowadził własne usprawnienia i opublikował swoją wersję na <a href="https://github.com/joyent/dtruss-osx" title="dtruss extended version" target="_blank" class="extlink" rel="nofollow">github&#8217;ie</a>.</p>
<p><b>6.</b> <code>soconnect_mac.d</code></p>
<p>- skrypt ten również nie wchodzi w standardowy zestaw narzędzi DTrace. Oczywiście można go ściągnąć w wgrać do systemu z <a href="http://www.dtracebook.com/index.php/Network_Lower_Level_Protocols:soconnect.d" title="soconnect_mac.d" target="_blank" class="extlink" rel="nofollow">oficjalnej strony</a> książki poświęconej DTrace. Pozwala on na śledzenie wychodzących z systemu połączeń TCP.  </p>
<pre>
[agresor@darkstar ~]$ sudo sconnect.d
PID    PROCESS          FAM ADDRESS          PORT   LAT(us) RESULT
534    ssh              2   11.111.11.11     22       39993 Success
19     opendirectoryd   2   12.123.12.123    389        107 In progress
543    Adium            2   22.222.222.222   5222        88 In progress
543    Adium            2   32.32.321.32     5222       113 In progress
</pre>
<p>Istnieje również narzędzie o nazwie <a href="http://dtracebook.com/index.php/Network_Lower_Level_Protocols:soaccept.d" title="soaccept_mac.d" target="_blank" class="extlink" rel="nofollow">soaccept_mac.d</a>, które służy z kolei do śledzenia połączeń przychodzących.</p>
<p><b>7.</b> <code>errinfo</code></p>
<p>- narzędzie to dostarcza podsumowania, które z wywołań systemowych zakończyły się błędem. Oprócz kodu błędu możemy uzyskać krótki opis kodu oraz nazwę procesu, który go wygenerował. Dzięki temu możemy szybko wyśledzić źle skonfigurowane lub nieprawidłowo obsługujące kody błędów aplikacje:</p>
<pre>
[agresor@darkstar ~]$ sudo errinfo
            EXEC          SYSCALL  ERR  DESC
            ntpd       sigsuspend    4  Interrupted system call
            ntpd        sigreturn   -2
            ntpd __pthread_canceled   22  Invalid argument
          iTerm             read   35  Resource temporarily unavailable
        perl5.12             read    4  Interrupted system call
        perl5.12        sigreturn   -2
        perl5.12 __pthread_canceled   22  Invalid argument
</pre>
<p>Innymi ciekawymi skryptami są: </p>
<ul class="check">
<li><code>bitesize.d</code> &#8211; charakterystyka rozkładu obciążenia I/O dysku według programów z podliczaniem liczby bajtów,</li>
<li><code>iotop</code> &#8211; funkcjonalnością to samo narzędzie, co <code>iosnoop</code>, lecz prezentujące dane bardzo podobnie do narzędzia <b>top</b>,</li>
<li><a href="http://dtracebook.com/index.php/File_System:maclife.d" title="maclife.d" target="_blank" class="extlink" rel="nofollow"><code>maclife.d</code></a> &#8211; skrypt śledzący tworzenie i kasowanie plików.</li>
</ul>
<p>Oprócz w/w skryptów w systemie Mac OS X istnieje jeszcze wiele narzędzi &#8211; wystarczy w konsoli uruchomić polecenie: <strong>man -k dtrace</strong>, aby naszym oczom ukazała się pełna lista:</p>
<pre>
bitesize.d(1m)           - analyse disk I/O size by process. Uses DTrace
cpuwalk.d(1m)            - Measure which CPUs a process runs on. Uses DTrace
creatbyproc.d(1m)        - snoop creat()s by process name. Uses DTrace
dappprof(1m)             - profile user and lib function usage. Uses DTrace
dapptrace(1m)            - trace user and library function usage. Uses DTrace
diskhits(1m)             - disk access by file offset. Uses DTrace
dispqlen.d(1m)           - dispatcher queue length by CPU. Uses DTrace
dtrace(1)                - generic front-end to the DTrace facility
dtruss(1m)               - process syscall details. Uses DTrace
errinfo(1m)              - print errno for syscall fails. Uses DTrace
execsnoop(1m)            - snoop new process execution. Uses DTrace
fddist(1m)               - file descriptor usage distributions. Uses DTrace
filebyproc.d(1m)         - snoop opens by process name. Uses DTrace
hotspot.d(1m)            - print disk event by location. Uses DTrace
httpdstat.d(1m)          - realtime httpd statistics. Uses DTrace
iofile.d(1m)             - I/O wait time by file and process. Uses DTrace
iofileb.d(1m)            - I/O bytes by file and process. Uses DTrace
iopattern(1m)            - print disk I/O pattern. Uses DTrace
iopending(1m)            - plot number of pending disk events. Uses DTrace
iosnoop(1m)              - snoop I/O events as they occur. Uses DTrace
iotop(1m)                - display top disk I/O events by process. Uses DTrace
kill.d(1m)               - snoop process signals as they occur. Uses DTrace
lastwords(1m)            - print syscalls before exit. Uses DTrace
loads.d(1m)              - print load averages. Uses DTrace
newproc.d(1m)            - snoop new processes. Uses DTrace
opensnoop(1m)            - snoop file opens as they occur. Uses DTrace
pathopens.d(1m)          - full pathnames opened ok count. Uses DTrace
pidpersec.d(1m)          - print new PIDs per sec. Uses DTrace
plockstat(1)             - front-end to DTrace to print statistics about POSIX
                           mutexes and read/write locks
priclass.d(1m)           - priority distribution by scheduling class. Uses DTrace
pridist.d(1m)            - process priority distribution. Uses DTrace
procsystime(1m)          - analyse system call times. Uses DTrace
runocc.d(1m)             - run queue occupancy by CPU. Uses DTrace
rwbypid.d(1m)            - read/write calls by PID. Uses DTrace
rwbytype.d(1m)           - read/write bytes by vnode type. Uses DTrace
rwsnoop(1m)              - snoop read/write events. Uses DTrace
sampleproc(1m)           - sample processes on the CPUs. Uses DTrace
seeksize.d(1m)           - print disk event seek report. Uses DTrace
setuids.d(1m)            - snoop setuid calls as they occur. Uses DTrace
sigdist.d(1m)            - signal distribution by process. Uses DTrace
syscallbypid.d(1m)       - syscalls by process ID. Uses DTrace
syscallbyproc.d(1m)      - syscalls by process name. Uses DTrace
syscallbysysc.d(1m)      - syscalls by syscall. Uses DTrace
topsyscall(1m)           - top syscalls by syscall name. Uses DTrace
topsysproc(1m)           - top syscalls by process name. Uses DTrace
weblatency.d(1m)         - website latency statistics. Uses DTrace
</pre>
<p>Plus te dostępne na <a href="http://www.dtracebook.com/" title="DTrace Book" target="_blank" class="extlink" rel="nofollow">stronie książki</a> o DTrace. Na koniec wypada przypomnieć, że DTrace nie tylko służy do wykonywania skryptów, ale jako framework umożliwia pisanie własnych programów, skryptów, czy jednolinijkowców. I nie chodzi tylko o MacBooki, ale jeśli używamy serwerów opartych na systemie operacyjnym <strong>Solaris</strong> lub <strong>FreeBSD</strong> możemy wykorzystać te wszystkie skrypty do codziennych prac administracyjnych i diagnozy problemów wydajnościowych.</p>
<p><span class="info"><b>Więcej informacji:</b> <a href="http://www.brendangregg.com/dtrace.html" title="DTrace Tools" target="_blank" class="extlink" rel="nofollow">DTrace Tools</a>, <a href="https://geneticmail.com/scott/library/text/solaris/solaris-dynamic-tracing-guide.pdf" title="Solaris Dynamic Tracing Guide" target="_blank" class="extlink" rel="nofollow">Solaris Dynamic Tracing Guide</a>, <a href="http://dtrace.org/blogs/brendan/2011/10/10/top-10-dtrace-scripts-for-mac-os-x/" title="Top 10 DTrace scripts for Mac OS X" target="_blank" class="extlink" rel="nofollow">Top 10 DTrace scripts for Mac</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://nfsec.pl/techblog/4015/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Przekierowanie 301 w varnish&#8217;u 3.x z uwzględnieniem adresów URL</title>
		<link>http://nfsec.pl/root/4075</link>
		<comments>http://nfsec.pl/root/4075#comments</comments>
		<pubDate>Fri, 04 May 2012 17:08:21 +0000</pubDate>
		<dc:creator>Patryk Krawaczyński</dc:creator>
				<category><![CDATA[Administracja]]></category>
		<category><![CDATA[3.0.2]]></category>
		<category><![CDATA[301]]></category>
		<category><![CDATA[redirect]]></category>
		<category><![CDATA[varnish]]></category>

		<guid isPermaLink="false">http://nfsec.pl/?p=4075</guid>
		<description><![CDATA[J eśli zależy nam na wykonaniu przekierowania HTTP 301 na poziomie varnish&#8216;a np. z adresu www.domena.pl na domena.pl razem z uwzględnieniem przekazanych adresów URL w domenie www.domena.pl wystarczy w podprogramie vcl_recv odpowiedzialnym za procesowanie żądania HTTP dodać kod: if (req.http.host == "www.domena.pl") { error 301; } - spowoduje to wyłapywanie nagłówka &#8222;Host&#8221; z ustawioną wartością [...]]]></description>
			<content:encoded><![CDATA[<p><span class="capital">J</span></p>
<p>eśli zależy nam na wykonaniu przekierowania <a href="http://pl.wikipedia.org/wiki/Kod_odpowiedzi_HTTP" title="Kody HTTP" target="_blank" class="extlink" rel="nofollow">HTTP 301</a> na poziomie <a href="https://www.varnish-cache.org/" title="Varnish" target="_blank" class="extlink" rel="nofollow">varnish</a>&#8216;a np. z adresu <strong>www.domena.pl</strong> na <strong>domena.pl</strong> razem z uwzględnieniem przekazanych adresów URL w domenie <i>www.domena.pl</i> wystarczy w podprogramie <code>vcl_recv</code> odpowiedzialnym za procesowanie żądania HTTP dodać kod:<br />
<span id="more-4075"></span></p>
<pre class="brush: plain;">
if (req.http.host == "www.domena.pl") {
    error 301;
}
</pre>
<p>- spowoduje to wyłapywanie <a href="http://pl.wikipedia.org/wiki/Lista_nag%C5%82%C3%B3wk%C3%B3w_HTTP" title="HTTP Headers" target="_blank" class="extlink" rel="nofollow">nagłówka &#8222;Host&#8221;</a> z ustawioną wartością na: www.domena.pl, zgłoszonego przez przeglądarkę lub inny program i przekazanie całego żądania do podprogramu <code>vcl_error</code>, gdzie możemy obsłużyć &#8222;błąd&#8221; 301:</p>
<pre class="brush: plain;">
if (obj.status == 301 &#038;&#038; req.http.host == "www.domena.pl") {
    set obj.http.location = "http://domena.pl" + req.url;
    set obj.status = 301;
    return (deliver);
}
</pre>
<p>W przypadku kiedy chcemy wykonać dużo przekierowań pomiędzy dwoma domenami bez uwzględnienia adresów URL &#8211; możemy skorzystać z specjalnego rozszerzenia do varnish&#8217;a <a href="https://www.varnish-cache.org/vmod/redirect" title="redirect vmod" target="_blank" class="extlink" rel="nofollow">redirect</a>, któremu wystarczy w przekazać wszystkie informacje w <code>vcl_recv</code>:</p>
<pre class="brush: plain;">
import redirect;

sub vcl_recv {
    if (req.http.host == "www.domena.pl") {
        error(redirect.location(301,"http://domena.pl"), "Moved Permanently");
    }
}
</pre>
<p>
<span class="info"><b>Więcej informacji:</b> <a href="https://www.varnish-cache.org/docs/3.0/tutorial/vcl.html" title="VCL" target="_blank" class="extlink" rel="nofollow">Varnish Configuration Language</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://nfsec.pl/root/4075/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Top statystyki dla memcached</title>
		<link>http://nfsec.pl/root/3988</link>
		<comments>http://nfsec.pl/root/3988#comments</comments>
		<pubDate>Sat, 28 Apr 2012 18:59:17 +0000</pubDate>
		<dc:creator>Patryk Krawaczyński</dc:creator>
				<category><![CDATA[Administracja]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[statystyki]]></category>
		<category><![CDATA[top]]></category>

		<guid isPermaLink="false">http://nfsec.pl/?p=3988</guid>
		<description><![CDATA[N icholas Tang napisał w perlu mały skrypt, który pozwala na wyciągnięcie z poziomu konsoli statystyk dla daemona memcached. Przyjmuje on następujące parametry: # If Getopt::Long is installed: # - Specify instances w/ --instances (multiple times or comma separated) # - Specify default port w/ --port (defaults to 11211) # - Specify sleep time w/ [...]]]></description>
			<content:encoded><![CDATA[<p><span class="capital">N</span></p>
<p>icholas Tang napisał w perlu mały skrypt, który pozwala na wyciągnięcie z poziomu konsoli statystyk dla daemona <a href="http://memcached.org/" title="memcached" target="_blank" class="extlink" rel="nofollow">memcached</a>. Przyjmuje on następujące parametry:<br />
<span id="more-3988"></span></p>
<pre>
#   If Getopt::Long is installed:
#     - Specify instances w/ --instances (multiple times or comma separated)
#     - Specify default port w/ --port (defaults to 11211)
#     - Specify sleep time w/ --sleep (default 3)
#     - Specify color output w/ --color (default) or --nocolor
#     - Specify lifetime stats w/ --lifetime or --nolifetime (default)
#       NOTE: lifetime stats break thresholds for evictions, bytes.
#     - Specify read and write bytes w/ --bytes (default) or --nobytes
#     - Specify get and set commands w/ --commands or --nocommands (default)
#     - Specify cumulative numbers w/ --cumulative (don't use with lifetime)
</pre>
<p>Opcja <code>instances</code> pozwala na monitorowanie wielu instancji daemona na raz &#8211; mogą one znajdować się na pojedynczym serwerze i różnych portach lub na tych samych portach, ale na różnych serwerach. Bez skryptu zawsze możemy skorzystać z <a href="http://lzone.de/articles/memcached.htm" title="memcached Telnet Interface" target="_blank" class="extlink" rel="nofollow">interfejsu telnet</a>.</p>
<p><span class="info"><b>Więcej informacji:</b> <a href="http://code.google.com/p/memcache-top/" title="memcache-top" target="_blank" class="extlink" rel="nofollow">memcache-top</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://nfsec.pl/root/3988/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slow Start tuning nie tylko dla jądra 3.2</title>
		<link>http://nfsec.pl/root/3869</link>
		<comments>http://nfsec.pl/root/3869#comments</comments>
		<pubDate>Sun, 22 Apr 2012 21:53:21 +0000</pubDate>
		<dc:creator>Patryk Krawaczyński</dc:creator>
				<category><![CDATA[Administracja]]></category>
		<category><![CDATA[cdn]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[initial congestion window]]></category>
		<category><![CDATA[rhel]]></category>
		<category><![CDATA[slow-start]]></category>
		<category><![CDATA[tuning]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://nfsec.pl/?p=3869</guid>
		<description><![CDATA[W edług protalu webhosting.pl od wersji 3.2 jądra Linuksa został zwiększony rozmiar okna ograniczenia przesyłu (ang. the initial congestion window) z 3 do 10. Sam Saffron po wykonaniu kilku testów udowodnił, że tuning mechanizmu Slow-start pozwala na przyśpieszenie ładowania strony WWW (jeśli zastosujemy zmiany na maszynie pełniącej rolę web serwera) nawet do 25% &#8211; bez [...]]]></description>
			<content:encoded><![CDATA[<p><span class="capital">W</span></p>
<p>edług protalu <a href="http://webhosting.pl/Linux.3.2.na.serwerze.WWW.uszczesliwi.klientow.firm.hostingowych" title="Linux 3.2 na serwerze WWW uszczęśliwi klientów firm hostingowych " target="_blank" class="extlink" rel="nofollow">webhosting.pl</a> od wersji 3.2 jądra Linuksa  został zwiększony rozmiar okna ograniczenia przesyłu (ang. <em>the initial congestion window</em>) z 3 do 10. <a href="http://samsaffron.com/archive/2012/03/01/why-upgrading-your-linux-kernel-will-make-your-customers-much-happier" title="Why upgrading your Linux Kernel will make your customers much happier" target="_blank" class="extlink" rel="nofollow">Sam Saffron</a> po wykonaniu kilku testów udowodnił, że tuning mechanizmu <a href="http://pl.wikipedia.org/wiki/Slow-start" title="Slow Start" target="_blank" class="extlink" rel="nofollow">Slow-start</a> pozwala na przyśpieszenie ładowania strony WWW (jeśli zastosujemy zmiany na maszynie pełniącej rolę web serwera) nawet do <b>25%</b> &#8211; bez żadnej ingerencji w warstwę aplikacji. Podobne testy przeprowadzili technicy wyszukiwarki <a href="http://chemeo.com" title="Chemeo" target="_blank" class="extlink" rel="nofollow">Cheméo</a> uzyskując w własnych warunkach <a href="http://chemeo.com/doc/technology/slow-start" title="Slow Start Tuning" target="_blank" class="extlink" rel="nofollow"><b>20%</b> przyśpieszenie</a>. Czy osoby pragnące wprowadzić podobne zmiany skazane są na oczekiwanie, aż popularne dystrybucje zaczną używać jądra w wersji 3.2 &#8211; jak np. <a href="http://www.ubuntu.com" title="Ubuntu" target="_blank" class="extlink" rel="nofollow">Ubuntu 12.04</a>?<br />
<span id="more-3869"></span><br />
Otóż nie. <a href="https://lwn.net/Articles/427104/" title="Increasing the TCP initial congestion window" target="_blank" class="extlink" rel="nofollow">Okazuje się</a>, że <a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=442b9635c569fef038d5367a7acd906db4677ae1" title="tcp: Increase the inital congestion window to 10" target="_blank" class="extlink" rel="nofollow">zmiany</a> rozmiaru okna zostały już <a href="http://kernelnewbies.org/Linux_2_6_39#head-c2acd2f0463943210471a42bf6f5b469a6999e7b" title="Linux 2.6.39 changelog" target="_blank" class="extlink" rel="nofollow">wprowadzone</a> w jądrze w wersji <b>2.6.39</b>. A, co z takimi dystrybucjami jak np. <strong>Debian 6.0</strong> lub <strong>CentOS 6.2</strong>, które korzystają jeszcze z wersji <strong>2.6.32</strong> ? W celu osiągnięcia tych samych rezultatów mogą skorzystać z polecenia:</p>
<pre class="brush: plain;">
ip route change default via $MYGATEWAY dev $MYDEVICE initcwnd 10
</pre>
<p>Gdzie: <code>$MYGATEWAY</code> to standardowa brama sieciowa oraz <code>$MYDEVICE</code> to karta sieciowa podłączona do tej bramy. </p>
<pre>
[root@stardust ~]# ip route show | egrep ^default
default via 91.121.72.254 dev eth0
</pre>
<p>Niestety ze względu na <a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=86bcebafc5e7f5163ccf828792fe694b112ed6fa" title="tcp: fix 2 iw selection" target="_blank" class="extlink" rel="nofollow">błąd</a> polecenie to poprawnie zadziała tylko dla jądra Linuksa równego lub większego od wersji <strong>2.6.30</strong>.</p>
<pre>
[root@stardust ~]# ip route show | egrep ^default
default via 91.121.72.254 dev eth0  initcwnd 10
</pre>
<p>Poniżej zamieszczam wyniki mini testów dla głównej strony tego bloga, jakie wykonałem przy pomocy serwisu <a href="http://tools.pingdom.com/" target="_blank" class="extlink" rel="nofollow">Pingdom Tools</a>. Pierwszy test wykonywany był z <strong>initcwnd</strong> ustawionym na wartość <strong>3</strong>. Kolejne dwa testy odbyły się już z wartością <strong>10</strong> (zmienna waga strony wynika z ładowania różnych zewnętrznych reklam pochodzących z serwisu <a href="http://www.adtaily.pl/" target="_blank" class="extlink" rel="nofollow">AdTaily</a>).</p>
<pre>
[initcwnd 03] Ilość żądań: 44 | czas ładowania: 1.92s | waga strony: 265.1 KB
[initcwnd 10] Ilość żądań: 44 | czas ładowania: 604ms | waga strony: 265.1 KB
[initcwnd 10] Ilość żądań: 44 | czas ładowania: 526ms | waga strony: 271.1 KB
</pre>
<p>Należy jednak zaznaczyć, że ustawienie większego <strong>initcwnd</strong> nie oznacza, że klient komunikujący się z serwerem zawsze skorzysta z tej wielkości. Wynika to z faktu, że podczas &#8222;<a href="http://pl.wikipedia.org/wiki/TCP_(protok%C3%B3%C5%82)" title="TCP/IP" target="_blank" class="extlink" rel="nofollow">potrójnego uścisku dłoni</a>&#8221; serwer i klient przedstawiają rozmiary swoich okien &#8211; serwer <code>congestion window</code>, a klient okna odbiorczego (ang. <em>receive window aka RWIN</em>), które określa w bajtach maksymalną ilość danych, które nadawca może wysłać bez otrzymywania potwierdzenia. Niezależnie, po której stronie wartość ta będzie mniejsza &#8211; zostanie ona przyjęta jako podstawa transmisji &#8211; nadawca nie może przekroczyć wielkości odbiorcy i na odwrót. Dlatego ograniczenie może występować zarówno po stronie serwera, jak i klienta (różne systemy posiadają różne wartości).</p>
<p><code>Receive window</code> w systemie Linux nazywa się <b>initrwnd</b> &#8211; i może zostać zmienione od wersji <b>2.6.33</b> poleceniem:</p>
<pre class="brush: plain;">
ip route change default via $MYGATEWAY dev $MYDEVICE initrwnd 10
</pre>
<p>Ciekawe podejście zaprezentowali Aaron Peters oraz Sajal Kayan &#8211; konsultanci od webowej wydajności prowadzący serwis <a href="http://www.cdnplanet.com" title="Content Delivery Network" target="_blank" class="extlink" rel="nofollow">CDN planet</a> <a href="http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/" title="Tuning initcwnd for optimum performance" target="_blank" class="extlink" rel="nofollow">sugerując podniesienie</a> zarówno <b>initcwnd</b> oraz <b>initrwnd</b> na serwerach pośredniczących np. frontowych maszynach serwujących obrazki, które obsługują żądania przeglądarek, a kontaktującymi się z backendem w razie cache missów np. serwery Varnishowe, czy Nginx cacheujące ruch do Apache (na których został podniesiony tylko rozmiar <b>initcwnd</b>):</p>
<pre>
[IE / Firefox / Chrome] &lt;------------&gt; [ CDN server ] &lt;------------&gt; [ Backend server ]
-------| RWIN |-------------------| initcwnd |-| initrwnd |----------| initcwnd |------
</pre>
<p>Ustawienie dla serwera CDN możemy osiągnąć za pomocą polecenia:</p>
<pre class="brush: plain;">
ip route change default via $MYGATEWAY dev $MYDEVICE initrwnd 10 initcwnd 10
</pre>
<p>Autorzy serwisu przeprowadzili również <a href="http://www.cdnplanet.com/blog/initcwnd-settings-major-cdn-providers/" title="Initcwnd settings of major CDN providers" target="_blank" class="extlink" rel="nofollow">serię testów</a> różnych dostawców CDN i ich ustawień wielkości okna, z których wynika, że jeszcze nie wszystkie firmy uważają tą zmianę za konieczną. Tym bardziej, że zwiększenie <b>initcwnd</b>, jest jednym z wielu parametrów wydajności, jakie można zmienić w stosie sieciowym systemu Linux.</p>
<p><span class="info"><b>Więcej informacji:</b> <a href="https://developers.google.com/speed/articles/tcp_initcwnd_paper.pdf" title="Google Research" target="_blank" class="extlink" rel="nofollow">An Argument for Increasing TCP&#8217;s Inital Congestion Window</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://nfsec.pl/root/3869/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Robert Tappan Morris</title>
		<link>http://nfsec.pl/hack/3693</link>
		<comments>http://nfsec.pl/hack/3693#comments</comments>
		<pubDate>Sun, 22 Apr 2012 07:48:12 +0000</pubDate>
		<dc:creator>Patryk Krawaczyński</dc:creator>
				<category><![CDATA[Hackultura]]></category>
		<category><![CDATA[4bsd]]></category>
		<category><![CDATA[robert tappan morris]]></category>
		<category><![CDATA[sun]]></category>
		<category><![CDATA[vax]]></category>

		<guid isPermaLink="false">http://nfsec.pl/?p=3693</guid>
		<description><![CDATA[R obert Tappan Morris to amerykański informatyk, znany z napisania pierwszego robaka komputerowego. Jest on synem szefa informatyków w National Security Agency. W 1988 był doktorantem na wydziale informatyki Uniwersytetu Cornell. Prowadził w tym czasie badania nad błędami z systemami 4 BSD Unix. Korzystając z wykrytych błędów napisał program nazywany dzisiaj robakiem Morrisa, który potrafił [...]]]></description>
			<content:encoded><![CDATA[<p><span class="capital">R</span></p>
<p>obert Tappan Morris to amerykański informatyk, znany z napisania pierwszego robaka komputerowego. Jest on synem szefa informatyków w <b>National Security Agency</b>. W 1988 był doktorantem na wydziale informatyki Uniwersytetu Cornell. Prowadził w tym czasie badania nad błędami z systemami 4 BSD Unix. Korzystając z wykrytych błędów napisał program nazywany dzisiaj robakiem Morrisa, który potrafił mnożyć się na tych systemach. Robak został uruchomiony 2 listopada 1988 r. Miał on mnożyć się w ograniczony sposób jednak na wskutek błędu programisty nie zadziałało wbudowane ograniczenie i robak w krótkim czasie praktycznie sparaliżował działanie ówczesnego bardzo jeszcze skromnego Internetu zarażając ponad 6 tysięcy maszyn.<br />
<span id="more-3693"></span><br />
Robert miał wówczas 23 lata. Uczęszczał na studia doktoranckie na wydziale informatyki Uniwersytetu Cornell. Spokojny, sympatyczny młody człowiek ze stopniem magistra Uniwersytetu Harward nigdy nie miał nic wspólnego z przestępstwami czy hackingiem. Miał jednak słabość &#8211; lubił wykrywać błędy w systemach operacyjnych. Na jesieni 1988 roku Morris zaczął prace nad programem mającym na celu ukazanie wykrytych błędów w zabezpieczeniach systemu 4 BSD Unix. Program, po &#8222;wpuszczeniu&#8221; w sieć miał wykazać możliwość uzyskania dostępu do dowolnego innego komputera w sieci i np. zainfekowania go innym wirusem. &#8222;Czerw&#8221; (ang. <i>worm</i>), jak nazywano później program Morrisa. Miał mniej niż 100 linii kodu, a jednak Robert pisząc ten program popełnił drobny błąd, który kosztował go bardzo wiele. Czerw po uruchomieniu zajmował bardzo mało czasu procesora. Miał on pozostać w ukryciu, być niezauważalny nawet dla administratora (rootkit) i nie powodować w żadnych problemów. Morrisowi chodziło jedynie o udowodnienie, że może on się przenosić z komputera na komputer. Rozmnażanie czerwia było możliwe poprzez skorzystanie z błędów w kilku elementach systemu UNIX oraz poprzez odkrywanie łatwych do odgadnięcia haseł użytkowników. Główna część robaka mogła tylko infekować maszyny Digital Equipment Corporation klasy VAX, na których był uruchomiony system 4BSD oraz Sun-3. Cześć przenośna napisana w języku &#8222;C&#8221; &#8211; była hakiem abordażowym, czyli komponentem czerwia, który używany był do zaciągania głównej części kodu na innych systemach czyniąc z nich drugoplanowe ofiary. Morris przewidział, że nieskończone rozmnażanie się czerwia spowoduje zablokowanie komputerów. Dlatego też czerw &#8222;pytał się&#8221;, czy infekowany serwer zawiera już kopię programu, czy nie. To jednak mogłoby ułatwić administratorom pozbycie się programu, więc Robert zdecydował się, że mimo odpowiedzi &#8222;tak&#8221; w jednym na siedem przypadków czerw i tak uruchamiał się na komputerze jako nowy proces. Miało to ograniczyć prędkość rozmnażania się programu i uniknąć blokady systemu. Obliczenia Morrisa okazały się jednak błędne. Niecierpliwy Robert zdecydował się wprowadzić program do Internetu 2 listopada 1988 r. ok. godziny 20:00, mimo iż wymagał on jeszcze kilku poprawek. W celu ukrycia faktu, że program jest jego autorstwa &#8211; uruchomił go z jednego z serwerów uniwersytetu Harvard, do którego miał jeszcze dostęp. Czerw rozmnażał się powoli, ale sukcesywnie. Już w kilkanaście minut po uruchomieniu czerwia wiele komputerów zaczęło dotkliwie odczuwać jego obecność.</p>
<p>3 listopada o godzinie 00:34 obecność wirusopodobnego programu odkrył <b>Andy Suddyth</b> z Harvardu. W około dwie godziny od uruchomienia programu do większości maszyn nie mogli się dostać nawet administratorzy. Nie pomagało ich ponowne uruchomienie &#8211; czerw znów infekował system i powodował jego zawieszenie. Kiedy Morris zorientował się, co się dzieje, przy pomocy kolegi przygotował rozwiązanie problemu i rozesłać anonimowo po Sieci. Niestety, było już za późno. Czerw uniemożliwił w większości przypadków odebranie i przeczytanie listu. Nad zwalczeniem złośliwego programu pracowali specjaliści z tysięcy placówek w USA. Już w 12 godzin od infekcji informatycy z Uniwersytetu Kalifornijskiego w Berkeley i z Massachussetts Institute of Technology odkryli metodę likwidacji czerwia. Ze względu na odłączenie wielu komputerów od sieci dopiero 10 listopada udało się całkowicie przywrócić normalną pracę Internetu. Zainfekowanych zostało ponad 6000 komputerów klasy Sun 3 i VAX. Straty w każdej lokalizacji sięgały nierzadko od 200 do 50 tys. USA, a łączenie oceniono je na ok. 10 mln USD. Robert przyznał się do popełnionego błędu. W grudniu 1990 roku skazano go na 3 lata obserwacji sądowej, 400 godzin prac społecznych i grzywnę w wysokości 10 tyś. USD. Jego apelacja została odrzucona w marcu następnego roku. Algorytm działania czerwia był następujący:</p>
<p>1. Utworzenie listy wszystkich &#8222;sąsiednich komputerów&#8221; za pomocą mechanizmu &#8222;trusted hosts&#8221; w UNIXie.<br />
2. Próba znalezienia haseł dostępu użytkowników sąsiednich komputerów poprzez permutacje nazwy użytkownika korzystającego z protokołu rexec / rsh bez wymogu podania hasła; porównanie z listą 432 haseł dostarczonych przez i sprawdzenie w słowniku typowych haseł.<br />
3. Próba zainfekowania komputera poprzez:</p>
<p>- skorzystanie z znalezionego w kroku 2 dostępu,<br />
- błędu typu buffer overrun w daemonie fingerd,<br />
- wykorzystanie &#8222;tylnego wejścia&#8221; pozostawionego w programie sendmail w trybie debug.</p>
<p>4. Sprawdzenie czy sąsiednie komputery są już zainfekowane &#8211; w jednym na siedem przypadków jeśli odpowiedź była pozytywna &#8211; ponowne zainfekowanie maszyny.<br />
5. Przesłanie krótkiego kodu startowego do zainfekowanego komputera oraz jego automatyczna kompilacja i uruchomienie.<br />
6. Po 120 sekundach &#8211; pobranie z komputera źródłowego pełnego kodu czerwia i jego automatyczna kompilacja, a następnie uruchomienie &#8211; powrót do kroku 1.</p>
<p>Obecnie Robert pracuje jako profesor w  <a href="http://pl.wikipedia.org/wiki/Massachusetts_Institute_of_Technology" title="Massachusetts Institute of Technology" target="_blank" class="extlink" rel="nofollow">Massachusetts Institute of Technology</a>, ale nie zajmuje się już kwestią bezpieczeństwa systemów. Wpadka kosztowała go zbyt wiele. Jego wyrok był pierwszym jaki wydano na podstawie <a href="http://en.wikipedia.org/wiki/United_States_v._Morris" title="Computer Fraud and Abuse Act" target="_blank" class="extlink" rel="nofollow">Ustawy z 1984 r. o Przestępstwach i Nadużyciach Komputerowych</a>. Morris jest również bardzo dobrym przyjacielem <a href="http://nfsec.pl/hack/1878" title="Paul Graham">Paula Graham&#8217;a</a>. Graham zadedykował mu swoją książkę &#8222;<i>ANSI Common Lisp</i>&#8221; oraz nazwał język programowania, który generuje strony web sklepów online &#8211; RTML &#8211; ku jego czci. Graham również <a href="http://en.wikipedia.org/wiki/Robert_Tappan_Morris" title="RTM<br />
" target="_blank">wypowiada się o nim</a> jako osobistym bohaterze, który &#8222;nigdy się nie myli&#8221;. Razem z Graham&#8217;em w 1995 roku założyli firmę &#8222;<em>Viaweb</em>&#8222;, która zajmowała się tworzeniem sklepów online. W 1998 roku firma ta została kupiona przez <a href="http://pl.yahoo.com" title="Yahoo" target="_blank" class="extlink" rel="nofollow">Yahoo</a> za 48 milionów dolarów.</p>
<p><span class="info"><b>Więcej informacji:</b> <a href="http://pdos.csail.mit.edu/~rtm/" target="_blank" class="extlink" rel="nofollow">Strona domowa RTM</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://nfsec.pl/hack/3693/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prawa dostępu w notacji dziesiętnej</title>
		<link>http://nfsec.pl/root/3849</link>
		<comments>http://nfsec.pl/root/3849#comments</comments>
		<pubDate>Sat, 21 Apr 2012 19:14:05 +0000</pubDate>
		<dc:creator>Patryk Krawaczyński</dc:creator>
				<category><![CDATA[Administracja]]></category>
		<category><![CDATA[chmod]]></category>
		<category><![CDATA[informacje]]></category>
		<category><![CDATA[plik]]></category>
		<category><![CDATA[stat]]></category>

		<guid isPermaLink="false">http://nfsec.pl/?p=3849</guid>
		<description><![CDATA[J ak w &#8222;szybki i brudny&#8221; sposób odczytać z powłoki bash prawa dostępu do kilku plików prezentując je w sposób dziesiętny? Możemy do tego wykorzystać polecenie: stat i jego parametr -c, który pozwala na sformatowanie informacji wyjściowych: Wersja standardowa: [root@stardust ~]# stat logo1.png File: `logo1.png' Size: 8474 Blocks: 32 IO Block: 4096 zwykły plik Device: [...]]]></description>
			<content:encoded><![CDATA[<p><span class="capital">J</span></p>
<p>ak w &#8222;szybki i brudny&#8221; sposób odczytać z powłoki bash prawa dostępu do kilku plików prezentując je w sposób dziesiętny? Możemy do tego wykorzystać polecenie: <b>stat</b> i jego parametr <b>-c</b>, który pozwala na sformatowanie informacji wyjściowych:<br />
<span id="more-3849"></span><br />
Wersja standardowa:</p>
<pre>
[root@stardust ~]# stat logo1.png
  File: `logo1.png'
  Size: 8474      	Blocks: 32         IO Block: 4096   zwykły plik
Device: 808h/2056d	Inode: 4851410     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/ agresor)   Gid: (  500/ agresor)
Access: 2011-08-27 18:05:40.000000000 +0200
Modify: 2009-10-11 00:00:00.000000000 +0200
Change: 2012-04-21 20:53:20.000000000 +0200
</pre>
<p>
Wstępnie sformatowana:</p>
<pre>
[root@stardust ~]# stat -c "%n %a %G %g" logo1.png
logo1.png 644 agresor 500
</pre>
<p>
Interesująca nas lista plików:</p>
<pre>
[root@stardust ~]# stat -c "%a %n" logo*
644 logo1.png
644 logo2.png
644 logo.cdr
644 logo.eps
644 logo.png
</pre>
<p>
Analogiczna lista za pomocą polecenia <b>find</b>:</p>
<pre>
[root@stardust ~]# find logo* -printf '%m %p\n'
644 logo1.png
644 logo2.png
644 logo.cdr
644 logo.eps
644 logo.png
</pre>
<p>
<span class="info"><b>Więcej informacji:</b> man stat, man find</span></p>
]]></content:encoded>
			<wfw:commentRss>http://nfsec.pl/root/3849/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Varnish Book</title>
		<link>http://nfsec.pl/root/3829</link>
		<comments>http://nfsec.pl/root/3829#comments</comments>
		<pubDate>Sun, 15 Apr 2012 19:24:40 +0000</pubDate>
		<dc:creator>Patryk Krawaczyński</dc:creator>
				<category><![CDATA[Administracja]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[creative commons]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[varnish]]></category>
		<category><![CDATA[vmods]]></category>

		<guid isPermaLink="false">http://nfsec.pl/?p=3829</guid>
		<description><![CDATA[W 2008 roku Tollef Fog Heen (Varnish Software) napisał i wykonał pierwsze szkice do szkolenia &#8222;Varnish System Administration&#8222;. Od tego czasu rozwój nad materiałem przejął Kristian Lyngstøl (Varnish Software). W 2011 roku do przystosowania materiałów dla webdeveloperów został poproszony Jérôme Renard (39Web). Tak cała przygotowana treść została połączona w jedną zwartą publikację, która została opublikowana [...]]]></description>
			<content:encoded><![CDATA[<p><span class="capital">W</span></p>
<p> 2008 roku Tollef Fog Heen (<a href="http://www.varnish-software.com/" title="Varnish Software" target="_blank" class="extlink" rel="nofollow">Varnish Software</a>) napisał i wykonał pierwsze szkice do szkolenia &#8222;<em>Varnish System Administration</em>&#8222;. Od tego czasu rozwój nad materiałem przejął <a href="http://kly.no/" target="_blank" title="KL Blog" class="extlink" rel="nofollow">Kristian Lyngstøl</a> (<a href="http://www.varnish-software.com/" title="Varnish Software" target="_blank" class="extlink" rel="nofollow">Varnish Software</a>). W 2011 roku do przystosowania materiałów dla webdeveloperów został poproszony  Jérôme Renard (<a href="http://39web.fr/" title="Strategic IT" target="_blank" class="extlink" rel="nofollow">39Web</a>). Tak cała przygotowana treść została połączona w jedną zwartą publikację, która została opublikowana i udostępniona on-line 28 marca 2012 roku jako &#8222;<em>Varnish Book</em>&#8221; na licencji <a href="http://creativecommons.pl/" title="CC" target="_blank" class="extlink" rel="nofollow">Creative Commons</a> <em>CC-BY-NC-SA</em>.<br />
<span id="more-3829"></span><br />
Książka ta nie nauczy nas wszystkiego o akceleratorze HTTP Varnish, ale jak zaznaczają jej autorzy &#8211; zapoznając się z jej materiałem i wykonując ćwiczenia (bez oszukiwania!) poznamy podstawowe arkana pracy jego silnika, konfiguracji i administracji, jak i zrozumiemy w jaki sposób działa cacheowanie po stronie serwera i przeglądarki. Publikacja szczególnie polecana dla osób zaczynających przygodę z tym proxy serwerem.</p>
<p><span class="info"><b>Więcej informacji:</b> <a href="https://www.varnish-software.com/static/book/" title="The Varnish Book" target="_blank" class="extlink" rel="nofollow">The Varnish Book</a>, <a href="https://github.com/varnish/Varnish-Book/tree/master" target="_blank" class="extlink" rel="nofollow">Źródła książki</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://nfsec.pl/root/3829/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

