<?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>d2&#039;s lair</title>
	<atom:link href="http://d2.tdhack.com/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://d2.tdhack.com</link>
	<description></description>
	<lastBuildDate>Mon, 07 May 2012 20:19:29 +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>sed oneliners</title>
		<link>http://d2.tdhack.com/index.php/sed-oneliners/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sed-oneliners</link>
		<comments>http://d2.tdhack.com/index.php/sed-oneliners/#comments</comments>
		<pubDate>Mon, 07 May 2012 15:35:42 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[bash]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=221</guid>
		<description><![CDATA[A to taki zbiór używanych przeze mnie &#8222;jednolinijkowców&#8221; sed-a, awk, czasami też perla. Zdarza się, że potrzebujemy szybko wykonać jakieś czynności na większej liczbie plików i kilku serwerach, dlatego grzebanie w pojedynczych plikach ręcznie mija się z celem. Podejrzewam, że każdy znajdzie tutaj coś dla siebie. Ale jeśli myślicie, że te przykłady są zaawansowane, to [...]]]></description>
			<content:encoded><![CDATA[<p>A to taki zbiór używanych przeze mnie &#8222;jednolinijkowców&#8221; sed-a, awk, czasami też perla. Zdarza się, że potrzebujemy szybko wykonać jakieś czynności na większej liczbie plików i kilku serwerach, dlatego grzebanie w pojedynczych plikach ręcznie mija się z celem. Podejrzewam, że każdy znajdzie tutaj coś dla siebie. Ale jeśli myślicie, że te przykłady są zaawansowane, to popatrzcie na to: <a href="http://www.vidarholen.net/contents/junk/bashinvaders.html" title="bash invaders">bash invaders</a> oraz na <a href="http://uuner.doslash.org/forfun/sedtris.sed" title="sedtris">sedtris</a></p>
<p><span id="more-221"></span></p>
<pre>
# kasuje # między bond0:1 a network w pliku test.txt
    sed '/bond0:1/,/network/ s,^#,,g' test.txt

# drukuje tekst między szukanymi word1 i word2
    sed -n '/word1/,/word2/p' file.txt

# kasuje cały wiersz ze słowem 'kasuj'
    sed '/kasuj/d' plik.txt

# zahashuj linie od mapper włącznie do EOF włącznie
    sed -i '/mapper/,/EOF/ s,^,#,g' fstab

# zahashuj linie pomiędzy in case of i EOF bez tych linii
    sed '1,/in case of/! {/EOF/,/in case of/!s,^#,,g}' /etc/fstab

# zostawia z danego stringa tylko te znaki, które pasuja do wyrażenia regularnego
    echo /opt/app/bo1-prod/ | sed -e 's,.*\([b|f]o[1-4]-prod\).*,\1,'
    bo1-prod

# listuje funkcje zdefiniowane w .bash_profile i/lub .bashrc
    set | fgrep " ()"
    compgen -A function
    declare -F | sed 's/^declare -f //'
    declare -F | cut -d ' ' -f 3

# usuwa tagi html
    sed -r 's,<[^>]*>,,'
    sed -r 's,(<|/\*)[^>]*|(>|\*\/),,g;/^ *$/d'

# usuwa znaki nowej linii
    tr -d '\n'
    sed '{:q;N;s/\n//g;t q}' plik.txt

# zastępuje znak nowej linii spacją
    tr '\n' ' '

# wstaw : co każde dwa znaki
    sed 's,..,&#038;:,g;s,:$,,'

# liczy wystąpienia danego regexpa (tu akurat robi to samo, co wc -l)
    sed -n '$='

# zamiana lub dodanie czegoś po pierwszym wystąpieniu wzorca w pliku
    sed -e '0,/RewriteEngine On/s/RewriteEngine On/RewriteEngine On\r\nDUPA/' apache2.conf

# wypisanie sumy MD5 z pliku zawierającego te sumy :)
    grep -E '.*([a-f0-9]{32}).*' file | sed -e 's,.*\([a-f0-9]\{32\}\).*,\1,g' > file_clean
    # Jose's sed :)
    | sed -e 's/.*\([a-fA-F0-9]\{32\}\).*/\1/'

# liczy połączenia ustanowione na porcie 80 i sortuje wg ilości wystąpień
    netstat -atun | grep ESTABLISHED | grep ":80" | awk '{print $5}' | cut -d: -f1 | sed -e '/^$/d' |sort | uniq -c | sort -n

# IP address
    sed -r '^(([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-4])\.){3}([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-4])$'

# usuwa białe znaki
    sed -e 's,[ \t],,g'

# usuwa białe znaki i puste linie
    sed -E "/^(([\t ])?^$)|^#/d"

# usuwa linie X
    sed 'Xd'

# perl hack to show stars * as a filesystem usage
    du -k | sort -n | perl -ne 'if ( /^(\d+)\s+(.*$)/){$l=log($1+.1);$m=int($l/log(1024)); printf  ("%6.1f\t%s\t%25s  %s\n",($1/(2**(10*$m))),(("K","M","G","T","P")[$m]),"*"x (1.5*$l),$2);}'

# szukanie określonych typów plików we wskazanych kilku lokacjach
    find {data/posting,data/resume} -type f \( -name "*.Index" -o -name "*.bin" -o -name "*.Vocab" \)

# odzyskanie pojedynczej bazy z full dump-a mysql (--all-databases)
    sed -n '/^-- Current Database: `test`/,/^-- Current Database: `/p' fulldump.sql > test.sql

# dodanie tekstu w X linii
    sed -i Xi'#Constants to communicate to aggregator.\nTLK_AGGREGATOR_IP=\nTLK_AGGREGATOR_PORT=\n'

# pętla (tak, sed obsługuje pętle ;) )
    sed -e '{:loop s,:,l,g; t loop}'

# usuwa błędne wpisy z known_hosts (błędne = fingerprint się zmienił, używać z głową!)
    ssh-keygen -f "/home/demo/.ssh/known_hosts" -R localhost

# sumuje w kolumnach i dzieli przez ilość elementów
    echo -e "1\n2\n3"|awk '{sum += $NF} END {print sum/$NF}'

# dodaje coś na koniec linii
    sed -i '$a FC_iconvPath=/usr/bin/iconv' properties.txt
# dodaje do pierwszej linii
    sed -e '1i TalentFilterAuthorizationToken=' properties.txt
# dodaje PO pierwszej linii
    sed -e '1a TalentFilterAuthorizationToken=' properties.txt

# liczy ilość linii w plikach *.cf*
    find . -type f -iname "*.cf*" -exec wc -l {} \; |awk '{print $1}'|awk '{sum += $NF} END {print sum}'

# usuwa z tekstu niedrukowalne znaki ascii (non-printable ascii) [sed: -e expression #1, char 21: Invalid collation character]
    LC_ALL="POSIX"; POSIXLY_CORRECT=oeu; sed -i 's,[\x80-\xFF],.,g' plik.txt
    LC_ALL="POSIX"; POSIXLY_CORRECT=oeu; sed -e 's,\xB6,ś,g'

# pokazuje X-linię (print line)
    sed -n '45p' file
    awk 'NR==45' file

# odczytuje zewnętrzne IP
    wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
    wget -q -O - ifconfig.me/ip

# wypisuje zakres/rangę znaków
    awk '{for (i=4; i&ltNF; i++) print $i ; print $NF}'

# dokładne dopasowanie wzorca w sedzie
    sed -e "s,\<wzorzec\>,,g"
</pre>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/sed-oneliners/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linux Kernel + grsecurity &#8211; my way!</title>
		<link>http://d2.tdhack.com/index.php/linux-kernel-grsecurity-my-way/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linux-kernel-grsecurity-my-way</link>
		<comments>http://d2.tdhack.com/index.php/linux-kernel-grsecurity-my-way/#comments</comments>
		<pubDate>Mon, 07 May 2012 11:39:41 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[bash]]></category>
		<category><![CDATA[cfg]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[hardening]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=197</guid>
		<description><![CDATA[Krótko i na temat &#8211; będzie to art na temat rekompilacji kernela z tym, że po mojemu. Z racji tego, że używam na co dzień dystrybucji Debian, instrukcje i skrypty będą przeznaczone właśnie dla tego distro. Mam nadzieję na stworzenie kompleksowej obsługi instalacji nowego jajka i w miarę zrozumiałej dla wszystkich ;) Co jest potrzebne? [...]]]></description>
			<content:encoded><![CDATA[<p>Krótko i na temat &#8211; będzie to art na temat rekompilacji kernela z tym, że po mojemu. Z racji tego, że używam na co dzień dystrybucji Debian, instrukcje i skrypty będą przeznaczone właśnie dla tego distro. Mam nadzieję na stworzenie kompleksowej obsługi instalacji nowego jajka i w miarę zrozumiałej dla wszystkich ;)</p>
<p><span id="more-197"></span></p>
<p><strong>Co jest potrzebne?</strong></p>
<ul>
<li>źródła jądra Linuksa</li>
<li>patch grsecurity pasujący do pobranego kernela</li>
<li>paczki: fakeroot, kernel-package, libncurses5-dev, paxctl, bzip2</li>
</ul>
<p>Wszystkie operacje wykonujemy jako root:</p>
<pre>
01 root@srv # apt-get update &#038;&#038; apt-get install -y fakeroot, kernel-package, libncurses5-dev, paxctl, bzip2
02 root@srv # cd /usr/src
03 root@srv /usr/src # wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.3.4.tar.bz2
04 root@srv /usr/src # wget http://grsecurity.net/test/grsecurity-2.9-3.3.4-201204272006.patch
05 root@srv /usr/src # tar -jxf linux-3.3.4.tar.bz2
06 root@srv /usr/src # rm linux; ln -s linux-3.3.4 linux
07 root@srv /usr/src # cd linux
08 root@srv /usr/src/linux # cp /boot/config-`uname -r` .config
09 root@srv /usr/src/linux # patch -p1 < ../grsecurity-2.9-3.3.4-201204272006.patch
10 root@srv /usr/src/linux # make menuconfig
</pre>
<p>OK, co sie do tej pory stało? Zainstalowaliśmy potrzebne paczki (01) oraz przeszliśmy do katalogu, w którym będzie odbywała sie kompilacja (02). Następnie pobraliśmy źródła kernela oraz patch grsec (03 i 04). Po rozpakowaniu kernela (05) utworzyliśmy link symboliczny jako linux do wypakowanego katalogu linux-3.3.4 (06). Następnie weszliśmy do katalogu linux (07), skopiowaliśmy domyślny plik konfiguracyjny i zapisaliśmy go jako .config (08). Po wykonaniu patchowania kernela źródłem z grsec (09) zaczynamy konfigurację (10).</p>
<p>W pierwszym oknie załaduj konfigurację z pliku .config wykorzyctując "Load an Alternate Configuration File" a następnie przejdź do "Security options". Jeśli patchowanie przebiegło bez problemów, powinieneś zobaczyć:</p>
<p><a href="http://d2.tdhack.com/wp-content/uploads/01.png"><img src="http://d2.tdhack.com/wp-content/uploads/01.png" alt="" title="grsec" width="642" height="386" class="alignnone size-full wp-image-203" /></a></p>
<p>Co włączyć w zakładce "Grsecurity"? Moje ustawienia wyglądają następująco:</p>
<pre>
Security Level (Custom)
Memory Protections  --->
  [*] Deny reading/writing to /dev/kmem, /dev/mem, and /dev/port
  [*] Restrict VM86 mode
  [*] Disable privileged I/O
  [*] Harden ASLR against information leaks and entropy reduction
  [*] Deter exploit bruteforcing
  [*] Hide kernel symbols
  [*] Active kernel exploit response
Role Based Access Control Options  --->
  [ ] Disable RBAC system
  [*] Hide kernel processes
  (3) Maximum tries before password lockout
  (30) Time to wait after max password tries, in seconds
Filesystem Protections  --->
  [*] Proc restrictions
  [*]   Restrict /proc to user only
  [*] Additional restrictions
  [*] Linking restrictions
  [*] FIFO restrictions
  [*] Sysfs/debugfs restriction
  [*] Runtime read-only mount protection
  [*] Chroot jail restrictions
  [*]   Deny mounts
  [*]   Deny double-chroots
  [*]   Deny pivot_root in chroot
  [*]   Enforce chdir("/") on all chroots
  [*]   Deny (f)chmod +s
  [*]   Deny fchdir out of chroot
  [*]   Deny mknod
  [*]   Deny shmat() out of chroot
  [*]   Deny access to abstract AF_UNIX sockets out of chroot
  [*]   Protect outside processes
  [*]   Restrict priority changes
  [*]   Deny sysctl writes
  [*]   Capability restrictions
Kernel Auditing  --->
  [*] Single group for auditing
  (1007) GID for auditing
  [*] Exec logging
  [*] Resource logging
  [*] Log execs within chroot
  [*] Ptrace logging
  [*] Chdir logging
  [*] (Un)Mount logging
  [*] Signal logging
  [*] Fork failure logging
  [*] Time change logging
  [*] /proc/
<pid>/ipaddr support
  [*] Denied RWX mmap/mprotect logging
  [ ] ELF text relocations logging (READ HELP)
Executable Protections  --->
  [*] Dmesg(8) restriction
  [*] Deter ptrace-based process snooping
  [*] Require read access to ptrace sensitive binaries
  [*] Enforce consistent multithreaded privileges
  [*] Trusted Path Execution (TPE)
  [*]   Partially restrict all non-root users
  [*]   Invert GID option
  (1005)  GID for trusted users
Network Protections  --->
  [*] Larger entropy pools
  [*] TCP/UDP blackhole and LAST_ACK DoS prevention
  [*] Socket restrictions
  [*]   Deny any sockets to group
  (1004)  GID to deny all sockets for
  [*]   Deny client sockets to group
  (1003)  GID to deny client sockets for
  [*]   Deny server sockets to group
  (1002)  GID to deny server sockets for
Sysctl support  --->
  [*] Sysctl support
  [*]   Extra sysctl support for distro makers (READ HELP)
  [*]   Turn on features by default
Logging Options  --->
  (10) Seconds in between log messages (minimum)
  (6) Number of messages in a burst (maximum)
</pre>
<p>A PaX wygląda tak:</p>
<pre>
PaX Control  --->
  [*] Support soft mode
  [*] Use legacy ELF header marking
  [*] Use ELF program header marking
  [*] Use filesystem extended attributes marking
      MAC system integration (direct)  --->
Non-executable pages  --->
  [*] Enforce non-executable pages
  [*]   Paging based non-executable pages
  [*]   Segmentation based non-executable pages
  [*] Emulate trampolines
  [*] Restrict mprotect()
  [*]   Use legacy/compat protection demoting (read help)
  [*]   Allow ELF text relocations (read help)
  [*] Enforce non-executable kernel pages
Address Space Layout Randomization  --->
  [*] Address Space Layout Randomization
  [*] Randomize kernel stack base
  [*] Randomize user stack base
  [*] Randomize mmap() base
Miscellaneous hardening features  --->
  [*] Sanitize kernel stack
  [*] Prevent invalid userland pointer dereference
  [*] Prevent various kernel object reference counter overflows
  [*] Harden heap object copies between kernel and userland
  [*] Prevent various integer overflows in function size parameters
</pre>
<p>Tutaj mała uwaga: jeśli w zakładce "Grsecurity" włączymy logowanie exec(), to musimy liczyć się z tym, że system plików może tego nie wytrzymać. Bardziej obciążone systemy (współdzielone hostingi, shellownie) powinny się zaopatrzyć w dodatkowe miejsce na partycjach.</p>
<p>Taka konfiguracja pozwala na manipulowanie niektórymi parametrami z linii poleceń. Jeśli już wystartujemy system z nowym jajkiem, poprzez sysctl możemy sterować niektórymi ustawieniami. Przygotowałem ich spis wraz z opisem dostępnym w "help" podczas wyboru danej opcji z kernela. Należy je umieścić w pliku /etc/sysctl.conf:</p>
<pre>
################################################## GRSECURITY ####
kernel.grsecurity.grsec_lock = 0

#   If  you  say  Y  here,  non-root users will not be able to use
#dmesg(8) to view up to the last 4kb of messages in  the  kernelâs
#log buffer. If the sysctl option is enabled, a sysctl option with
#name "dmesg" is created.
kernel.grsecurity.dmesg = 0

#   If you say Y here, users with a  resource  limit  on  processes
# will  have  the value checked during execve() calls.  The current
# system only checks the system limit during fork() calls.  If  the
# sysctl  option is enabled, a sysctl option with name "execve_lim-
# iting" is created.
kernel.grsecurity.execve_limiting = 0

#   If you say Y here, all execve() calls will be logged (since the
# other exec*() calls are frontends to execve(), all execution will
# be logged).  Useful for shell-servers that like to keep track  of
# their  users.   If  the sysctl option is enabled, a sysctl option
# with name "exec_logging" is created. WARNING:  This  option  when
# enabled  will produce a LOT of logs, especially on an active sys-
# tem.
kernel.grsecurity.exec_logging = 0

#   If you say Y here, users will not be able  to  write  to  FIFOs
# they  donât own in world-writable +t directories (i.e. /tmp), un-
# less the owner of the FIFO is the same  owner  of  the  directory
# itâs  held  in.  If the sysctl option is enabled, a sysctl option
# with name "fifo_restrictions" is created.
kernel.grsecurity.fifo_restrictions = 0

kernel.grsecurity.forkfail_logging = 0

#    If you say Y here, /tmp race exploits will be prevented, since
# users will no longer be able to follow symlinks  owned  by  other
# users  in  world-writable  +t directories (i.e. /tmp), unless the
# owner of the symlink is the owner of the  directory.  users  will
# also  not  be  able to hardlink to files they do not own.  If the
# sysctl option is enabled, a sysctl option with name  "linking_re-
# strictions" is created.
kernel.grsecurity.linking_restrictions = 0

kernel.grsecurity.harden_ptrace = 0

#   If you say Y here, all attempts  to  overstep  resource  limits
# will  be  logged  with the resource name, the requested size, and
# the current limit.  It is highly recommended that you say Y here.
# If  the  sysctl option is enabled, a sysctl option with name "re-
# source_logging" is created.  If the RBAC system is  enabled,  the
# sysctl value is ignored.
kernel.grsecurity.resource_logging = 0

#    If  you  say Y here, all chdir() calls will be logged.  If the
# sysctl option is enabled, a sysctl option with name "audit_chdir"
# is created.
kernel.grsecurity.audit_chdir = 0

kernel.grsecurity.audit_gid = 20004

#   Setting this GID determines what group TPE restrictions will be
# *disabled* for.  If the sysctl option is enabled, a sysctl option
# with  name  "tpe_gid"  is  created.
kernel.grsecurity.tpe_gid = 20000

#   If you say Y here, the exec, chdir, and (un)mount logging  fea-
# tures  will  only operate on a group you specify.  This option is
# recommended if you only want to watch certain  users  instead  of
# having  a  large  amount  of logs from the entire system.  If the
# sysctl option is enabled, a sysctl option with name "audit_group"
# is created.
kernel.grsecurity.audit_group = 0

#    If  you say Y here, processes inside a chroot will not be able
# to raise the priority of processes in the chroot,  or  alter  the
# priority of processes outside the chroot.  This provides more se-
# curity than simply removing CAP_SYS_NICE from the processâ  capa-
# bility  set.   If  the  sysctl option is enabled, a sysctl option
# with name "chroot_restrict_nice"  is  created.
kernel.grsecurity.chroot_restrict_nice = 0

#    If  you say Y here, processes inside a chroot will not be able
# to kill,  send  signals  with  fcntl,  ptrace,  capget,  getpgid,
# setpgid,  getsid,  or view any process outside of the chroot.  If
# the sysctl option is enabled, a  sysctl  option  with  name  "ch-
# root_findtask" is created.
kernel.grsecurity.chroot_findtask = 0

#   If you say Y here, all executions inside a chroot jail will  be
# logged  to syslog.  This can cause a large amount of logs if cer-
# tain applications (eg. djbâs daemontools) are  installed  on  the
# system, and is therefore left as an option.  If the sysctl option
# is enabled, a sysctl option with name "chroot_execlog" is  creat-
# ed.
kernel.grsecurity.chroot_execlog = 1

#    If you say Y here, the current working directory of all newly-
# chrooted applications will be set to the the  root  directory  of
# the chroot. The man page on chroot(2) states: Note that this call
# does not change  the  current  working directory,  so   that  â.â
# can  be  outside the tree rooted at â/â.  In particular, the  su-
# per-user  can  escape  from  a âchroot jailâ by doing âmkdir foo;
# chroot  foo;  cd  ..â.   It  is  recommended that you say Y here,
# since itâs not known to break any software.  If the sysctl option
# is  enabled,  a sysctl option with name "chroot_enforce_chdir" is
# created.
kernel.grsecurity.chroot_enforce_chdir = 1

#   If you say Y here, processes inside a chroot will not  be  able
# to  connect  to  abstract (meaning not belonging to a filesystem)
# Unix domain sockets that were bound outside of a chroot.   It  is
# recommended  that  you  say  Y here.  If the sysctl option is en-
# abled, a sysctl option with name "chroot_deny_unix"  is  created.
kernel.grsecurity.chroot_deny_unix = 1

#    If you say Y here, an attacker in a chroot will not be able to
# write to sysctl entries, either by sysctl(2) or through  a  /proc
# interface.   It  is  strongly recommended that you say Y here. If
# the sysctl option is enabled, a  sysctl  option  with  name  "ch-
# root_deny_sysctl"   is   created.
kernel.grsecurity.chroot_deny_sysctl = 1

#   If you say Y here, processes inside a chroot will not  be  able
# to  attach to shared memory segments that were created outside of
# the chroot jail. It is recommended that you say Y here.   If  the
# sysctl  option  is enabled, a sysctl option with name "chroot_de-
# ny_shmat" is created.
kernel.grsecurity.chroot_deny_shmat = 1

#   If you say Y here, processes inside a chroot will not  be  able
# to use a function called pivot_root() that was introduced in Lin-
# ux 2.3.41.  It works similar to chroot in  that  it  changes  the
# root  filesystem.   This  function could be misused in a chrooted
# process to attempt to break out  of  the  chroot,  and  therefore
# should not be allowed.  If the sysctl option is enabled, a sysctl
# option with name "chroot_deny_pivot" is created.
kernel.grsecurity.chroot_deny_pivot = 1

#    If  you say Y here, processes inside a chroot will not be able
# to mount or remount filesystems.  If the  sysctl  option  is  en-
# abled,  a sysctl option with name "chroot_deny_mount" is created.
kernel.grsecurity.chroot_deny_mount = 1

#   If you say Y here, processes inside a chroot will  not  be  al-
# lowed  to mknod.  The problem with using mknod inside a chroot is
# that it would allow an attacker to create a device entry that  is
# the  same as one on the physical root of your system, which could
# range from anything from the console device to a device for  your
# harddrive  (which  they could then use to wipe the drive or steal
# data).  It is recommended that you say Y here, unless you run in-
# to software incompatibilities. If the sysctl option is enabled, a
# sysctl option with name  "chroot_deny_mknod"  is  created.
kernel.grsecurity.chroot_deny_mknod = 1

#    If  you say Y here, a well-known method of breaking chroots by
# fchdirâing to a file descriptor of  the  chrooting  process  that
# points to a directory outside the filesystem will be stopped.  If
# the sysctl option is enabled, a  sysctl  option  with  name  "ch-
# root_deny_fchdir"   is   created.
kernel.grsecurity.chroot_deny_fchdir = 1

#   If you say Y here, processes inside a chroot will not  be  able
# to chroot again outside the chroot.  This is a widely used method
# of breaking out of a chroot jail and should not be  allowed.   If
# the  sysctl  option  is  enabled,  a sysctl option with name "ch-
# root_deny_chroot" is created.
kernel.grsecurity.chroot_deny_chroot = 1

#    If  you say Y here, processes inside a chroot will not be able
# to chmod or fchmod files to make them have  suid  or  sgid  bits.
# This  protects against another published method of breaking a ch-
# root.  If the sysctl option is enabled, a sysctl option with name
# "chroot_deny_chmod"   is  created.
kernel.grsecurity.chroot_deny_chmod = 1

#   If you say Y here, the capabilities on all root processes with-
# in  a  chroot  jail will be lowered to stop module insertion, raw
# i/o, system and net admin tasks, rebooting the system,  modifying
# immutable files, modifying IPC owned by another, and changing the
# system time. This is left an option because  it  can  break  some
# apps.   Disable  this  if  your chrooted apps are having problems
# performing those kinds of tasks.  If the  sysctl  option  is  en-
# abled,  a sysctl option with name "chroot_caps" is created.
kernel.grsecurity.chroot_caps = 0

#   If you say Y here, all attempts to  attach  to  a  process  via
# ptrace will be logged.  If the sysctl option is enabled, a sysctl
# option with name  "audit_ptrace"  is  created.
kernel.grsecurity.audit_ptrace = 0

#   If you say Y here, calls to mmap() and mprotect() with explicit
# usage of PROT_WRITE and PROT_EXEC together will  be  logged  when
# denied  by the PAX_MPROTECT feature.  If the sysctl option is en-
# abled, a sysctl option with  name  "rwxmap_logging"  is  created.
kernel.grsecurity.rwxmap_logging = 0

#    If  you  say  Y here, text relocations will be logged with the
# filename of the offending library or binary.  The purpose of  the
# feature  is  to help Linux distribution developers get rid of li-
# braries and binaries that need text relocations which hinder  the
# future  progress  of  PaX.   Only  Linux  distribution developers
# should say Y here, and never on a production machine, as this op-
# tion  creates  an  information leak that could aid an attacker in
# defeating the randomization of a single memory  region.   If  the
# sysctl  option  is enabled, a sysctl option with name "audit_tex-
# trel" is created.
kernel.grsecurity.audit_textrel = 0

#   If you say Y here, you will be able to choose a gid to  add  to
# the  supplementary  groups of users you want to mark as "untrust-
# ed." These users will not be able to execute any files  that  are
# not  in  root-owned  directories  writable  only by root.  If the
# sysctl option is enabled, a sysctl option with name "tpe" is cre-
# ated.
kernel.grsecurity.tpe = 0

#    If  you say Y here, all non-root users will be covered under a
# weaker TPE restriction.  This is separate from, and  in  addition
# to, the main TPE options that you have selected elsewhere.  Thus,
# if a "trusted" GID is chosen, this restriction  applies  to  even
# that GID. Under this restriction, all non-root users will only be
# allowed to execute files in directories they  own  that  are  not
# group  or  world-writable,  or  in  directories owned by root and
# writable only by root.  If the sysctl option is enabled, a sysctl
# option with name "tpe_restrict_all" is created.
kernel.grsecurity.tpe_restrict_all = 0

#   If you say Y here, the group you specify in the TPE  configura-
# tion  will  decide what group TPE restrictions will be *disabled*
# for.  This option is useful if you want TPE  restrictions  to  be
# applied to most users on the system.  If the sysctl option is en-
# abled, a sysctl option with name "tpe_invert" is created.  Unlike
# other sysctl options, this entry will default to on for backward-
# compatibility.
kernel.grsecurity.tpe_invert = 0

#   If you say Y here, neither TCP resets nor ICMP  destination-un-
# reachable  packets  will  be  sent in response to packets sent to
# ports for which no associated listening process exists. This fea-
# ture  supports both IPV4 and IPV6 and exempts the loopback inter-
# face from blackholing.  Enabling this feature makes a  host  more
# resilient  to  DoS attacks and reduces network visibility against
# scanners.  The blackhole  feature  as-implemented  is  equivalent
# to the FreeBSD blackhole feature, as it prevents RST responses to
# all packets, not just SYNs.  Under most application behavior this
# causes no problems, but applications (like haproxy) may not close
# certain connections in a way that cleanly terminates them on  the
# remote  end,  leaving the remote host in LAST_ACK state.  Because
# of this side-effect and to prevent  intentional  LAST_ACK  DoSes,
# this feature also adds automatic mitigation against such attacks.
# The mitigation drastically reduces the amount of  time  a  socket
# can spend in LAST_ACK state.  If youâre using haproxy and not all
# servers it connects to have this option  enabled,  consider  dis-
# abling  this feature on the haproxy host.   If  the sysctl option
# is enabled, two sysctl  options  with  names  "ip_blackhole"  and
# "lastack_retries" will be created. While "ip_blackhole" takes the
# standard zero/non-zero on/off toggle, "lastack_retries" uses  the
# same  kinds  of values as "tcp_retries1" and "tcp_retries2".  The
# default value of 4 prevents a socket from lasting  more  than  45
# seconds  in  LAST_ACK  state.  kernel.grsecurity.ip_blackhole = 0
kernel.grsecurity.lastack_retries = 0

#   If you say Y here, you will be able to choose a  GID  of  whose
# users  will be unable to connect to other hosts from your machine
# or run server applications from your machine.  If the sysctl  op-
# tion is enabled, a sysctl option with name "socket_all" is creat-
# ed.
kernel.grsecurity.socket_all = 0

#   If you say Y here, you will be able to choose a  GID  of  whose
# users will be unable to connect to other hosts from your machine,
# but will be able to run servers.  If this option is enabled,  all
# users in the group you specify will have to use passive mode when
# initiating ftp transfers from the shell on your machine.  If  the
# sysctl  option  is  enabled,  a  sysctl  option  with name "sock-
# et_client" is created.
kernel.grsecurity.socket_client = 0

#   If you say Y here, you will be able to choose a  GID  of  whose
# users  will  be  unable  to run server applications from your ma-
# chine.  If the sysctl option is enabled,  a  sysctl  option  with
# name "socket_server" is created.
kernel.grsecurity.socket_server = 0

#   If you say Y here, a sysctl option with name  "romount_protect"
# will  be  created.   By  setting  this  option  to  1 at runtime,
# filesystems will be protected in the following ways:
# *  No new  writable  mounts  will  be allowed
# *  Existing read-only mounts wonât be able to be remounted
#    read/write
# *  Write  operations  will  be denied on all block devices
# This option acts independently of grsec_lock:  once  it is set to
# 1,  it  cannot  be turned off.  Therefore, please be  mindful  of
# the resulting behavior if this option is enabled in an init
# script on a read-only filesystem. This feature is mainly intended
# for secure embedded systems.
# kernel.grsecurity.romount_protect = 0

#   Here you can choose the GID to disable socket access  for.  Re-
# member  to  add  the users you want socket access disabled for to
# the GID specified here.  If  the  sysctl  option  is  enabled,  a
# sysctl  option with name "socket_all_gid" is created.
kernel.grsecurity.socket_all_gid = 20001

#   Here you can choose the GID to  disable  client  socket  access
# for. Remember to add the users you want client socket access dis-
# abled for to the GID specified here.  If the sysctl option is en-
# abled,  a sysctl option with name "socket_client_gid" is created.
kernel.grsecurity.socket_client_gid = 20002

#   Here you can choose the GID to  disable  server  socket  access
# for. Remember to add the users you want server socket access dis-
# abled for to the GID specified here.  If the sysctl option is en-
# abled,  a sysctl option with name "socket_server_gid" is created.
kernel.grsecurity.socket_server_gid = 20003

#   If you say Y here, all mounts and unmounts will be logged.   If
# the  sysctl  option  is  enabled,  a sysctl option with name "au-
# dit_mount" is created.
kernel.grsecurity.audit_mount = 0

#   If you say Y here, certain important signals  will  be  logged,
# such  as SIGSEGV, which will as a result inform you of when a er-
# ror in a program occurred, which in some cases could mean a  pos-
# sible  exploit attempt. If the sysctl option is enabled, a sysctl
# option with name "signal_logging" is  created.
kernel.grsecurity.signal_logging = 0

#    If  you say Y here, all failed fork() attempts will be logged.
# This could suggest a fork bomb, or someone attempting to overstep
# their  process  limit.  If the sysctl option is enabled, a sysctl
# option with name "forkfail_logging" is created.
kernel.grsecurity.forkfail_logging = 0

#    If  you  say  Y  here, any changes of the system clock will be
# logged. If the sysctl option is enabled,  a  sysctl  option  with
# name    "timechange_logging"    is   created.
kernel.grsecurity.timechange_logging = 0
</pre>
<p>Tutaj uwaga na opcję "kernel.grsecurity.grsec_lock = 0" - jeśli w pliku /etc/sysctl.conf ustawimy ją na "1" to nie będziemy mieli już możliwości zmiany parametrów *.grsec* z poziomu sysctl!</p>
<p>W porządku, zatem mamy przygotowany kernel, ustawione opcje. Teraz należy wykonać kompilację:</p>
<pre>
01 root@srv /usr/src/linux # export CONCURRENCY_LEVEL=$[`cat /proc/cpuinfo|grep ^processor|wc -l|awk '{print $1}'`]
02 root@srv /usr/src/linux # make-kpkg clean &#038;&#038; make-kpkg --rootcmd fakeroot --initrd kernel_image kernel_headers
</pre>
<p>Co tym razem robimy? Ustawiamy parametr "CONCURRENCY_LEVEL" na wartość X, gdzie X to liczba wątków procesora dostępnych dla systemu (01). Warto wspomnieć, że przypiszemy wszystkie wątki, aby kompilacja przebiegła w miarę szybko. Jeśli jednak chcesz zachować jakieś zasoby dla systemu, ustaw CONCURRENCY_LEVEL=$[`cat /proc/cpuinfo|grep ^processor|wc -l|awk '{print $1}'` - 1 ]. Następnie wykonujemy kompilację, która stworzy paczkę *.deb zarówno z nowym jakiem, jak i headerami dla niego. Po udanej akcji w katalogu /usr/src powinnieneś zobaczyć:</p>
<pre>
root@srv /usr/src/linux # ls -al /usr/src/
-rw-r--r--  1 root root  6903602 03-29 19:56 linux-headers-3.3.4-d2_3.3.4-d2-10.00.Custom_i386.deb
-rw-r--r--  1 root root  6889906 05-04 00:10 linux-image-3.3.4-d2_3.3.4-d2-10.00.Custom_i386.deb
</pre>
<p>Skąd się wzięła opcja "-d2" w tej nazwie? (będzie ona prezentowana jako nazwa kernela po wydaniu polecenia uname -r, tutaj: <strong>3.3.4-d2</strong>). Aby ustawić własną wersję należy w "General setup  --->" dopisać własną rewizję do parametru "Local version - append to kernel release", a z pliku /usr/src/linux/localversion-grsec wywalić wpis "-grsec".</p>
<p>W kernelach z gałęzi 2.6.3x na debianie 5 (i 6 zresztą też) występował czasami taki problem:</p>
<blockquote><p>echo "The UTS Release version in include/linux/version.h";<br />
echo "       \"\" ";<br />
echo "does not match current version:";<br />
echo "       \"2.6.33.1\" "<br />
echo "Please correct this."; exit 2<br />
The UTS Release version in include/linux/version.h<br />
       ""<br />
does not match current version:<br />
       "2.6.33.3"<br />
Please correct this.
</p></blockquote>
<p>Można to szybko naprawić ręcznie:</p>
<pre>
1) Otwórz /usr/share/kernel-package/ruleset/misc/version_vars.mk

2) Znajdź:
UTS_RELEASE_HEADER=$(call doit,if [ -f include/linux/utsrelease.h ]; then  \
                           echo include/linux/utsrelease.h;            \
                       else                                            \
                               echo include/linux/version.h ;              \
                       fi) 

3) Zamień na:
UTS_RELEASE_HEADER=$(call doit,if [ -f include/generated/utsrelease.h ]; then \
                               echo include/generated/utsrelease.h;           \
                           elif [ -f include/linux/utsrelease.h ]; then       \
                               echo include/linux/utsrelease.h;               \
                           else                                               \
                               echo include/linux/version.h;                  \
                           fi) 

4) Otwórz:
5) Zmień zawartość /etc/kernel/postinst.d/initramfs-tools na:
#!/bin/sh

version="$1"
bootopt=""

# passing the kernel version is required
[ -z "${version}" ] &#038;&#038; exit 0

# kernel-package passes an extra arg
if [ -n "$2" ]; then
  if [ -n "${KERNEL_PACKAGE_VERSION}" ]; then
    bootdir=$(dirname "$2")
    bootopt="-b ${bootdir}"
  else
    # official Debian linux-images take care themself
    exit 0
  fi
fi

# avoid running multiple times
if [ -n "$DEB_MAINT_PARAMS" ]; then
  eval set -- "$DEB_MAINT_PARAMS"
  if [ -z "$1" ] || [ "$1" != "configure" ]; then
    exit 0
  fi
fi

# we're good - create initramfs.  update runs do_bootloader
update-initramfs -c -t -k "${version}" ${bootopt}
</pre>
<p>OK, chyba się udało. Teraz aby zainstalować nowe jajko wydajemy polecenie:</p>
<pre>
root@srv /usr/src # dpkg -i linux-headers-3.3.4-d2_3.3.4-d2-10.00.Custom_i386.deb
root@srv /usr/src # dpkg -i linux-image-3.3.4-d2_3.3.4-d2-10.00.Custom_i386.deb
</pre>
<p>UWAGA: przy instalacji kolejnej wersji jajka, przy włączonym grsec, należy włączyć opcje <strong>PAGEEXEC</strong> oraz <strong>SEGMEXEC</strong>. W przeciwnym przypadku będziesz miał kłopot z post-instalacyjnymi skryptami, które wywołuje dpkg:</p>
<pre>
root@srv # paxctl -c /usr/sbin/grub-probe
root@srv # paxctl -C /usr/sbin/grub-probe
root@srv # paxctl -ps /usr/sbin/grub-probe
</pre>
<p>I teraz najważniejszy moment instalacji. Zakładam, że nie używasz narzędzi typu kexec, KVM (tym razem nie kernel virtual machine, tylko keyboard-video-mouse ;) ), iLO, *RAC itd, tylko samego SSH. Może się zdarzyć, że nowy kernel nie wstanie (kernel panic...) i będzie kłopot z rebootem maszyny, która siedzi sobie np 100km od Ciebie. Z pomocą przychodzi grub i jego opcje, które pozwolą nam na bezpieczny reboot do nowej wersji, a w przypadku paniki, czy innego błędu, który nie pozwoli wstać maszynie - przywróci starą, działającą wersję kernela.</p>
<p>Operacje, które teraz będziemy wykonywać to "grub failsafe". Jest w sieci kilka artów na ten temat, ale nie wszystkie były opisane w pigułce. Przyjrzyjmy się fail-safe dla gruba1 i gruba2:</p>
<blockquote><p>==== grub<br />
1. install kernel + headers<br />
2. edit /boot/grub/menu.lst<br />
    default         saved<br />
3. przy NOWYM kernelu<br />
    ... panic=5<br />
    savedefault 1<br />
4. przy DOBRYM kernelu<br />
    savedefault<br />
5. set default<br />
    grub-set-default 2 (dobry kernel)<br />
6. reboot<br />
    grub-reboot 0 (nowy kernel)</p>
<p>==== grub2</p>
<p>1. install kernel + headers<br />
2. edit /etc/default/grub<br />
    GRUB_DEFAULT=saved<br />
    GRUB_CMDLINE_LINUX_DEFAULT="quiet panic=5"<br />
3. set default<br />
    grub-set-default 2 (dobry kernel)<br />
4. regenerate config<br />
    grub-mkconfig<br />
    update-grub<br />
    update-grub2<br />
5. reboot do nowego<br />
    grub-reboot 0 (nowy kernel)</p>
<p>root@srv # cat /boot/grub/grubenv<br />
saved_entry=2 <- dobry kernel<br />
prev_saved_entry=<br />
[...]
</p></blockquote>
<p>Wybierz opcję odpowiadającą Twojej konfiguracji. Jeśli wszystko skonfigurowałeś prawidłowo, wykonaj reboot i sprawdź, czy system wstał z nowym kernelem weryfikując poprzez:</p>
<pre>
root@srv # uname -a
Linux tdhack.com <strong>3.3.4-d2</strong> #1 SMP Fri May 4 00:09:04 CEST 2012 i686 GNU/Linux
</pre>
<p>Na tym moglibyśmy skończyć, gdyby nie fakt, że dobrze by było wszystkie te operacje zautomatyzować ;) Do tego celu napisałem poniższy skrypt: <a href="http://d2.tdhack.com/wp-content/uploads/compile_kernel.txt" title="compile_kernel.sh">compile_kernel.sh</a></p>
<p>Co robi skrypt? Szuka na stronach najnowszej wersji grsecurity, później ściąga kernel pod tą wersję. Patchuje, kompiluje i gotowe paczki wrzuca do $HOME przy okazji informując mailowo administratora o przebiegu instalacji oraz o lokacji nowego kernela. Taki skrypt można sobie wrzucić do crona i raz w tygodniu pobawić się kompilacją:</p>
<pre>
0 0 * * sat /root/scripts/compile_kernel.sh > /dev/null 2>&#038;1
</pre>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/linux-kernel-grsecurity-my-way/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jak zablokować popup &#8222;Skype Home&#8221;?</title>
		<link>http://d2.tdhack.com/index.php/how-to-disable-skype-home-popup/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-disable-skype-home-popup</link>
		<comments>http://d2.tdhack.com/index.php/how-to-disable-skype-home-popup/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 05:44:23 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[solution]]></category>
		<category><![CDATA[facepalm]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[żenada]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=115</guid>
		<description><![CDATA[Ściągnij starszą wersję skype: http://download.skype.com/msi/SkypeSetup_5.3.0.120.msi Odinstaluj tę, którą masz teraz zainstalowaną Przejdź do katalogu c:\Users\&#60;YOUR_USERNAME&#62;\AppData\Roaming\Skype\ Skasuj katalog shared_dynco i shared_httpfe Utwórz pliki o nazwach shared_httpfe i shared_dynco (pamiętaj PLIKI, a nie katalogi!) Zainstaluj Skype 5.3 I to wszystko. Koniec z denerwującymi popupami. No, przynajmniej na razie&#8230;]]></description>
			<content:encoded><![CDATA[<li>Ściągnij starszą wersję skype: <a title="Skype version 5.3" href="http://download.skype.com/msi/SkypeSetup_5.3.0.120.msi">http://download.skype.com/msi/SkypeSetup_5.3.0.120.msi</a></li>
<li>Odinstaluj tę, którą masz teraz zainstalowaną</li>
<li>Przejdź do katalogu <strong>c:\Users\&lt;YOUR_USERNAME&gt;\AppData\Roaming\Skype\</strong></li>
<li>Skasuj katalog <strong>shared_dynco</strong> i <strong>shared_httpfe</strong></li>
<li>Utwórz <strong>pliki</strong> o nazwach shared_httpfe i shared_dynco (pamiętaj PLIKI, a nie katalogi!)</li>
<li>Zainstaluj <strong>Skype 5.3</strong></li>
<p>I to wszystko. Koniec z denerwującymi popupami. No, przynajmniej na razie&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/how-to-disable-skype-home-popup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GPG!</title>
		<link>http://d2.tdhack.com/index.php/gpg-ftw/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gpg-ftw</link>
		<comments>http://d2.tdhack.com/index.php/gpg-ftw/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 14:11:12 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[info]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=95</guid>
		<description><![CDATA[Czyli GNU Privacy Guard jest projektem Open Source. Pozwala w prosty sposób utrzymać wysoki poziom bezpieczeństwa przesyłanych danych poprzez ich szyfrowanie. Zasada działania z grubsza polega na wygenerowaniu asymetrycznych kluczy generowanych dla każdego użytkownika osobo: prywatnego i publicznego. Prywatny z tajnym hasłem to twój klucz, którego powinieneś strzec. Publiczny, to klucz który możesz swobodnie dystrybuować. [...]]]></description>
			<content:encoded><![CDATA[<p>Czyli <a title="GNU Privacy Guard" href="http://www.gnupg.org/" target="_blank">GNU Privacy Guard</a> jest projektem Open Source. Pozwala w prosty sposób utrzymać wysoki poziom bezpieczeństwa przesyłanych danych poprzez ich szyfrowanie. Zasada działania z grubsza polega na wygenerowaniu asymetrycznych kluczy generowanych dla każdego użytkownika osobo: prywatnego i publicznego. Prywatny z tajnym hasłem to twój klucz, którego powinieneś strzec. Publiczny, to klucz który możesz swobodnie dystrybuować.</p>
<p><span id="more-95"></span></p>
<p>Ktoś, kto zechce wysłać podpisaną wiadomość do ciebie, powinien posiadać twój klucz publiczny. Jeśli ty chciałbyś zaszyfrować dane dla kogoś, powinieneś posiadać jego klucz publiczny, zatem przed rozpoczęciem korespondencji dobrze jest się wymienić kluczami (można szyfrować dla kogoś jednocześnie stosując cyfrowy podpis swoim kluczem).</p>
<p>Oczywiście możliwe jest też szyfrowanie symetryczne, w którym wykorzystywane jest po prostu hasło. Użytkownik, otrzymawszy plik *.gpg jest zobligowany do podania hasła i w tym momencie dane zostaną odszyfrowane.</p>
<p>Gdzie można stosować GPG? Oto najczęstsze przypadki:</p>
<li>email, podpisujemy/szyfrujemy swoje wiadomości</li>
<li>pliki oraz wiadomości przesyłane przez różne serwery</li>
<li>raporty, tabelki, wykresy &#8211; słowem korporacyjne dane</li>
<p>Zdaję sobie sprawę, że dla laika korzystanie z CLI GPG może być trudne, dlatego polecam program o nazwie <a title="Cryptophane" href="http://code.google.com/p/cryptophane/" target="_blank">Cryptophane</a>. Na stronie projektu do wyboru jest zaciągnięcie samego programu cryptophane, lub cryptophane+gpg. Polecam ściągnąć ten drugi, gdyż instalator zrobi za nas wszystko, instalując podstawowy program oraz niezbędne biblioteki.</p>
<p style="text-align: center;"><a href="http://d2.tdhack.com/wp-content/uploads/capture_05062012_121521.png"><img class="alignnone size-full wp-image-142" title="cryptophane" src="http://d2.tdhack.com/wp-content/uploads/capture_05062012_121521.png" alt="" width="671" height="333" /></a></p>
<p>Program integruje się w windowsowym Explorerem, dzięki czemu szyfrowanie/odszyfrowanie pliku sprowadza się do kliknięcia ppm na wybranym pliku i wybraniu opcji &#8216;encrypt&#8217; oraz klucza, którym chcemy zaszyfrować dane.</p>
<p><a href="http://d2.tdhack.com/wp-content/uploads/d2.asc">Tutaj</a> jest mój klucz publiczny &#8211; jeśli chcesz się ze mną podzielić czymś poufnym, zaszyfruj proszę swoje pliki/wiadomości. Dzięki!</p>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/gpg-ftw/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rozwiązywanie problemów</title>
		<link>http://d2.tdhack.com/index.php/problem-solving-flowsheet/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=problem-solving-flowsheet</link>
		<comments>http://d2.tdhack.com/index.php/problem-solving-flowsheet/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 13:51:26 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[solution]]></category>
		<category><![CDATA[fun]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=86</guid>
		<description><![CDATA[Dla tych, którzy mają kłopoty z rozwiązaniem niektórych problemów ;)]]></description>
			<content:encoded><![CDATA[<p>Dla tych, którzy mają kłopoty z rozwiązaniem niektórych problemów ;)</p>
<p><img src="http://d2.tdhack.com/wp-content/uploads/problem-solving-flowsheet.jpg" alt="... and problem solved ;)" /></p>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/problem-solving-flowsheet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak zmienić server string w nginx?</title>
		<link>http://d2.tdhack.com/index.php/how-to-change-nginx-server-string/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-change-nginx-server-string</link>
		<comments>http://d2.tdhack.com/index.php/how-to-change-nginx-server-string/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 08:20:22 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[bash]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[change server string]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=72</guid>
		<description><![CDATA[Jeśli chciałbyś zmienić serwer string pokazywany przy każdym requeście, to może być how to dla ciebie ;) nginx zazwyczaj odpowiada w taki sposób: HTTP/1.1 200 OK Date: Tue, 06 Jul 2010 08:14:19 GMT Server: nginx/0.7.67 Aby się go pozbyć trzeba edytować źródło, a potem przekompilować. Pliki, które wymagają drobnych modyfikacji znajdują się w: src/core/nginx.h src/http/ngx_http_header_filter_module.c [...]]]></description>
			<content:encoded><![CDATA[<p>Jeśli chciałbyś zmienić serwer string pokazywany przy każdym requeście, to może być how to dla ciebie ;)</p>
<p><span id="more-72"></span></p>
<p>nginx zazwyczaj odpowiada w taki sposób:</p>
<blockquote><p>HTTP/1.1 200 OK<br />
Date: Tue, 06 Jul 2010 08:14:19 GMT<br />
Server: nginx/0.7.67</p></blockquote>
<p>Aby się go pozbyć trzeba edytować źródło, a potem przekompilować. Pliki, które wymagają drobnych modyfikacji znajdują się w:</p>
<blockquote><p>src/core/nginx.h<br />
src/http/ngx_http_header_filter_module.c<br />
conf/fastcgi_params</ul>
</blockquote>
<p>Jeśli nie chcecie ręcznie ich modyfikować, skorzystajcie ze skryptu który napisałem. Aby go użyć, wystarczy zapisać go jako script.sh, zmienić uprawnienia chmod u+x i wykonać: ./script.sh &lt;katalog_ze_źródłem_nginx&gt;. Rzućcie okiem, potestujcie i dajcie znać, jakby coś nie działało. Miłego!</p>
<pre>
#!/bin/bash

DIR=${1}
SERVERNAME=Paranoid
SERVERVERSION=0.4.2

if [[ $# &lt; 1 ]]; then
    echo "`basename ${0}` {dir}"
    echo -e "\n\tExample: `basename ${0}` nginx-0.7.64"
    exit 1
fi

if [[ -e ${DIR}/src/core/nginx.h ]]; then
    sed -i "/#define NGINX_VERSION/ s,\"[^\"]*\",${SERVERVERSION}," ${DIR}/src/core/nginx.h
    sed -i "/#define NGINX_VER/ s,nginx,${SERVERNAME}," ${DIR}/src/core/nginx.h
    sed -i "/#define NGINX_VAR/ s,\"NGINX\",\"`echo ${SERVERNAME}| tr \"[a-z]\" \"[A-Z]\"`\"," ${DIR}/src/core/nginx.h
else
    echo "Can not find ${DIR}/src/core/nginx.h"
fi

if [[ -e ${DIR}/src/http/ngx_http_header_filter_module.c ]]; then
    sed -i "s,Server: nginx,Server: ${SERVERNAME}," ${DIR}/src/http/ngx_http_header_filter_module.c
else
    echo "Can not find ${DIR}/src/http/ngx_http_header_filter_module.c"
fi

if [[ -e ${DIR}/conf/fastcgi_params ]]; then
    sed -i "s,nginx/$nginx_version,${SERVERNAME}/$nginx_version," ${DIR}/conf/fastcgi_params
else
    echo "Can not find ${DIR}/conf/fastcgi_params"
fi
</pre>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/how-to-change-nginx-server-string/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>podatność w mod_rpaf?</title>
		<link>http://d2.tdhack.com/index.php/mod_rpaf-vulnerability/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mod_rpaf-vulnerability</link>
		<comments>http://d2.tdhack.com/index.php/mod_rpaf-vulnerability/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 11:00:51 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[bug]]></category>
		<category><![CDATA[info]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[load balancer]]></category>
		<category><![CDATA[mod_rpaf]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[rpaf]]></category>
		<category><![CDATA[vulnerability]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=67</guid>
		<description><![CDATA[rpaf jest modułem wykorzystywanym w web serwerach rodziny Apache. Zamienia zdalny adres klienta widoczny dla innych modułów Apache w momencie gdy dwa warunki zostają spełnione. Po pierwsze, zdalny klient to w zasadzie proxy, a drugi &#8211; jeśli istnieje nagłówek X-Forwarded-For. Wtedy rpaf zabiera ostatni widziany w headerze adres IP i zmienia REMOTE_ADDR na tą wartość. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">rpaf jest modułem wykorzystywanym w web serwerach rodziny Apache.</p>
<p><span id="more-67"></span></p>
<p style="text-align: justify;">Zamienia zdalny adres klienta widoczny dla innych modułów Apache w momencie gdy dwa warunki zostają spełnione. Po pierwsze, zdalny klient to w zasadzie proxy, a drugi &#8211; jeśli istnieje nagłówek X-Forwarded-For. Wtedy rpaf zabiera ostatni widziany w headerze adres IP i zmienia REMOTE_ADDR na tą wartość. Jest to bardzo pomocne przy logowaniu prawdziwego adresu IP w sytuacji, gdzie przed web serwerem (lub całą farmą) stoi load balancer. Dzięki temu w access.log oraz error.log widzimy faktyczne adresy klientów, którzy przechodzą po drodze przez X węzłów, a nie adresy tych węzłów.</p>
<p style="text-align: justify;">Ostatnia wersja: 0.6</p>
<p>OK, wstęp mamy za sobą. Teraz co się stanie, jeśli dodamy lub zmienimy nagłówek X-Forwarded-For dodając niewłaściwe wartości, jak to pokazałem poniżej?</p>
<blockquote><p>x-forwarded-for: \&#8217;\&#8221;);|]*{<br />
&lt;</p></blockquote>
<p>Apache 2.2.12 zgłosi błąd &#8222;400 bad request&#8221; po czym jeden wątek, który obsługiwał taki request zaliczy segmentation fault :)</p>
<blockquote><p># cat /var/log/apache2/access.log<br />
IP.IP.IP.IP &#8211; - [14/Jun/2010:10:24:53 +0200] &#8222;GET / HTTP/1.1&#8243; 400 573 &#8222;referer: -&#8221; &#8222;-&#8221;</p>
<p># cat /var/log/apache2/error.log<br />
[Mon Jun 14 10:27:22 2010] [error] [client IP.IP.IP.IP] request failed: error reading the headers<br />
[Mon Jun 14 10:27:31 2010] [notice] child pid 1877 exit signal Segmentation fault (11)</p></blockquote>
<p>Czy to się da nadużyć bardziej? Na razie nie wiem.</p>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/mod_rpaf-vulnerability/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Obliczanie sum MD5 w bash-u</title>
		<link>http://d2.tdhack.com/index.php/calculating-md5-sum-under-bash/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=calculating-md5-sum-under-bash</link>
		<comments>http://d2.tdhack.com/index.php/calculating-md5-sum-under-bash/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 10:52:38 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[bug]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[different result]]></category>
		<category><![CDATA[echo]]></category>
		<category><![CDATA[md5]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sum]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=65</guid>
		<description><![CDATA[Ostanio napisałem sobie na szybko skrypt do sprawdzania i porównywania sum MD5 plików w systemie, ale jak porównałem rezultaty z &#8216;ręczną robotą&#8217; (bez skojarzeń! ;) ) to się okazało, że nowy skrypt nie działa. Ponieważ nie mógł to być przypadek, że wszystkie sumy zostały źle obliczone, to postanowiłem sprawdzić inne narzędzia: $ php -r "echo [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ostanio napisałem sobie na szybko skrypt do sprawdzania i porównywania sum MD5 plików w systemie, ale jak porównałem rezultaty z &#8216;ręczną robotą&#8217; (bez skojarzeń! ;) ) to się okazało, że nowy skrypt nie działa. Ponieważ nie mógł to być przypadek, że wszystkie sumy zostały źle obliczone, to postanowiłem sprawdzić inne narzędzia:</p>
<p><span id="more-65"></span></p>
<pre>
$ php -r "echo md5('test1234');"
16d7a4fca7442dda3ad93c9a726597e4

echo test1234|md5sum|awk '{print $1}'
eddc02b200ae8a15a7e6b44ac05bf5f1
</pre>
<p style="text-align: justify;">W PHP działa, więc jaki jest powód? Rozwiązanie jest dość proste. Użyłem komendy &#8216;echo&#8217; do drukowania znaków, które później miały być hashowane w MD5. Domyślnie &#8216;echo&#8217; dodaje znak nowej linii (\n) do tych znaków i dlatego md5sum źle (dobrze!) przeliczał. Aby uniknąć tego kłopotu należy dodać przełącznik &#8216;-n&#8217; do echo, który &#8211; przedrukowując za MANualem &#8211; nie wypisuj znaku nowej linii na końcu wiersza.</p>
<pre>
$ php -r "echo md5('test1234');"
16d7a4fca7442dda3ad93c9a726597e4

$ echo -n test1234|md5sum|awk '{print $1}'
16d7a4fca7442dda3ad93c9a726597e4
</pre>
<p>No i wszystko działa :)</p>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/calculating-md5-sum-under-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache2 [emerg] (28)No space left on device</title>
		<link>http://d2.tdhack.com/index.php/apache2-emerg-28no-space-left-on-device-couldnt-create-accept-lock/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=apache2-emerg-28no-space-left-on-device-couldnt-create-accept-lock</link>
		<comments>http://d2.tdhack.com/index.php/apache2-emerg-28no-space-left-on-device-couldnt-create-accept-lock/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 08:47:21 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[solution]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[emerg]]></category>
		<category><![CDATA[emergency]]></category>
		<category><![CDATA[no space left on device]]></category>
		<category><![CDATA[problem]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=52</guid>
		<description><![CDATA[Kiedy restartujesz Apache, może się zdarzyć, że nie wstanie, mimo iż na konsoli dostaniesz komunikat, że wszystko jest OK. Jeśli zauważysz w error.log-u błąd typu [emerg](28)No space left on device: Couldn&#8217;t create accept lock to masz dwa wyjścia: sprawdzić, czy rzeczywiście nie brakuje już miejsca na dysku (df -h), albo &#8230; przeglądnij output strace, aby [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Kiedy restartujesz Apache, może się zdarzyć, że nie wstanie, mimo iż na konsoli dostaniesz komunikat, że wszystko jest OK. Jeśli zauważysz w error.log-u błąd typu <b>[emerg](28)No space left on device: Couldn&#8217;t create accept lock</b> to masz dwa wyjścia: sprawdzić, czy rzeczywiście nie brakuje już miejsca na dysku (df -h), albo &#8230; przeglądnij output strace, aby poznać szczegóły:</p>
<p><span id="more-52"></span></p>
<blockquote><p># tail -10 f /var/log/apache2/error.log<br />
[Fri Feb 05 13:29:49 2010] [emerg] (28)No space left on device: Couldn&#8217;t create accept lock</p></blockquote>
<p>strace of this process shows:</p>
<blockquote><p># strace -f /etc/init.d/apache2 restart</p>
<p>[...]<br />
[pid 26787] fcntl64(15, F_GETFD)        = 0&#215;1 (flags FD_CLOEXEC)<br />
[pid 26787] fcntl64(15, F_SETFD, FD_CLOEXEC) = 0<br />
[pid 26787] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)<br />
[pid 26787] _llseek(0, 0, [0], SEEK_CUR) = 0<br />
[pid 26787] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)<br />
[pid 26787] _llseek(1, 0, [0], SEEK_CUR) = 0<br />
[pid 26787] ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)<br />
[pid 26787] _llseek(2, 0, [47419], SEEK_CUR) = 0<br />
[pid 26787] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)<br />
[pid 26787] _llseek(0, 0, [0], SEEK_CUR) = 0<br />
[pid 26787] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)<br />
[pid 26787] _llseek(1, 0, [0], SEEK_CUR) = 0<br />
[pid 26787] ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)<br />
[pid 26787] _llseek(2, 0, [47419], SEEK_CUR) = 0<br />
[pid 26787] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)<br />
[pid 26787] _llseek(0, 0, [0], SEEK_CUR) = 0<br />
[pid 26787] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)<br />
[pid 26787] _llseek(1, 0, [0], SEEK_CUR) = 0<br />
[pid 26787] ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff2b568) = -1 ENOTTY (Inappropriate ioctl for device)<br />
[pid 26787] _llseek(2, 0, [47419], SEEK_CUR) = 0<br />
[pid 26787] stat64(&#8222;/var/log/apache2/httpd.pid&#8221;, {st_mode=S_IFREG|0640, st_size=6, &#8230;}) = 0<br />
[pid 26787] gettimeofday({1265372989, 308944}, NULL) = 0<br />
[pid 26787] write(2, &#8222;[Fri Feb 05 13:29:49 2010] [warn]&#8222;&#8230;, 139) = 139<br />
[pid 26787] open(&#8222;/var/log/apache2/httpd.pid&#8221;, O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE|O_CLOEXEC, 0644) = 16<br />
[pid 26787] fcntl64(16, F_GETFD)        = 0&#215;1 (flags FD_CLOEXEC)<br />
[pid 26787] fcntl64(16, F_SETFD, FD_CLOEXEC) = 0<br />
[pid 26787] write(16, &#8222;26787\n&#8221;&#8230;, 6)  = 6<br />
[pid 26787] close(16)                   = 0<br />
[pid 26787] semget(IPC_PRIVATE, 1, IPC_CREAT|0600) = -1 ENOSPC (No space left on device)<br />
[pid 26787] gettimeofday({1265372989, 315808}, NULL) = 0</p></blockquote>
<p>Widać wyraźnie, że z brakiem miejsca to nie ma nic wspólnego, za to z <a class="wp-caption" title="semaphores" href="http://en.wikipedia.org/wiki/Semaphore_%28programming%29" target="_blank">semaforami już więcej</a> zatem albo je zredukujemy albo wyczyścimy całkowicie dla danego użytkownika. Ja preferuję opcję 2.</p>
<pre>
USER=`cat /etc/apache2/apache2.conf |grep User|grep -v LogF|awk '{print $2}'`
for sem in `ipcs -s |grep ${USER:0:5}| awk '{print $2}'`; do
    ipcrm -s ${sem}
done
</pre>
<p>Natępnie musimy nieco poprawić system. Dla Linux Debian:</p>
<pre>
# echo -e "\n\n# tuning of semaphores (apache related issues with no space left on device)\nkernel.msgmni = 1024\nkernel.sem = 250 256000 32 1024" &gt;&gt; /etc/sysctl.conf
</pre>
<p>a następnie wymusić przez system odczytanie nowych wartości:</p>
<pre># sysctl -p</pre>
<p>No i załatwione.</p>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/apache2-emerg-28no-space-left-on-device-couldnt-create-accept-lock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nowy (stary) bug w ThunderBird (3.0.4)</title>
		<link>http://d2.tdhack.com/index.php/new-old-bug-in-thunderbird-3-0-4/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=new-old-bug-in-thunderbird-3-0-4</link>
		<comments>http://d2.tdhack.com/index.php/new-old-bug-in-thunderbird-3-0-4/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 17:13:49 +0000</pubDate>
		<dc:creator>d2</dc:creator>
				<category><![CDATA[bug]]></category>
		<category><![CDATA[3.0.4]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[input]]></category>
		<category><![CDATA[thunderbird]]></category>

		<guid isPermaLink="false">http://d2.tdhack.com/?p=47</guid>
		<description><![CDATA[Dzisiaj, po jakimś czasie spędzonym przy HTML, wydawało mi się że odkryłem nowy błąd w ThunderBird (v. 3.0.4). Przygotowałem następujący kod HTML: &#60;form action="http://some.server.com/hcp/" method="get"&#62; &#60;input type="text" name="u_firstname" value="test"/ size="25%" /&#62; &#60;/form&#62; I wysłałem do siebie jako HTML używając właśnie ThunderBird-a. Kiedy otworzyłem tego maila, zobaczyłem zwykłą formatkę input z tekstem &#8216;test&#8217;. Nic nadzwyczajnego, ale [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj, po jakimś czasie spędzonym przy HTML, wydawało mi się że odkryłem nowy błąd w ThunderBird (v. 3.0.4).<br />
<span id="more-47"></span><br />
Przygotowałem następujący kod HTML:</p>
<pre>&lt;form action="http://some.server.com/hcp/" method="get"&gt;
&lt;input type="text" name="u_firstname" value="test"/ size="25%" /&gt;
&lt;/form&gt;</pre>
<p>I wysłałem do siebie jako HTML używając właśnie ThunderBird-a. Kiedy otworzyłem tego maila, zobaczyłem zwykłą formatkę input z tekstem &#8216;test&#8217;. Nic nadzwyczajnego, ale w momencie, gdy kliknąłem/najechałem kursorem myszy na pole &#8216;text&#8217; zostałem natychmiast przekierowany na &#8216;some.server.com&#8217;. Dziwna sprawa tym bardziej, że nie klikałem żadnego submit/send, których nawet nie byłow tym kodzie :) Fajna sprawa jeśli chcesz kogoś wmanipulować do odwiedzenia nieporządanej (złośliwej :) ) strony ]:-&gt; Zobaczcie na ten kod:</p>
<pre>&lt;form action="http://evil.server.com" method="get"&gt;
Your password will expire within next &lt;b&gt;1&lt;/b&gt; day. Please update your profile by visiting following link:&lt;input type="text" value="http://google.com"/ size="25%" onmouseover="this.style.cursor='pointer';"/&gt;
&lt;/form&gt;</pre>
<p>Zobaczycie w mailu głupią wiadomość o wygaśnięciu hasła i coś, co wygląda, jak link. Jak na to kliniesz &#8230; to już wiesz co się stanie. Wart wspomnieć, że żadne dane nie są transferowane przy takim przekierowaniu (zapomnijcie o GET/POST).</p>
<p>Miałem zamiar to gdzieś opublikować, tzn zgłosić ;) ale najpier wypadało się upewnić, że nie odkrywam koła na nowo. No cóż, ktoś to już jednak zrobił za mnie i nawet opublikował na mozilli. Link do bugzilli:</p>
<p><a title="BUG" href="https://bugzilla.mozilla.org/show_bug.cgi?id=542325" target="_blank">https://bugzilla.mozilla.org/show_bug.cgi?id=542325</a></p>
<p>No i macie &#8211; półroczny błąd, odkryty na nowo. Badum, tssss.</p>
]]></content:encoded>
			<wfw:commentRss>http://d2.tdhack.com/index.php/new-old-bug-in-thunderbird-3-0-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

