Why fork(2) doesn’t copy all threads?

There are many advises discouraging the use of fork in threaded applications…it is even on “Programming with POSIX Threads” by Butenhof….Avoid using fork in threaded program (if you can) unless you intend to exec a new program immediately.

Certainly using fork in threaded programs is not a good idea but sometimes it becomes necessary, so, the point is: why fork(2) doesn’t copy all threads?

First time I  asked myself  “does a forked process have all the parent’s threads?” I thought yes but, I was wrong.  The specification say it: A process shall be created with a single thread

So why?

  • Because is more practical, easier, and less complex.
    • There are only two alternatives, copy all of them or copy just the one calling fork. Each alternative has it own set of complexities, so, which approach is easier to follow? Copying only the thread that called fork.
  • Critical sections: Other threads could be executing critical sections at fork() call, therefore child process might get a copy of objects that are in undefined status => causing undefined behavior on the application. Σ =
  • Parent and child could be reading from fd or socket at the same time, or even worse writing to it.  あぶない
  • Since state in parent and child should be the same, all parent’s threads should be stopped before to be forked and if in the middle of a system call EINTR would be raised
  • .

Specification mentions forkall was rejected, that means that I was not alone.
It is easier to deal with one thread using pthread_atfork() than dealing with multiple threads on the child.
As long as it is specified it is OK
Advertisements

Hard Disk

Mejorar el rendimiento del disco duro:

  • Revisar el adecuado uso de swap.
    • Setearel uso de swap a un valor bajo. En /etc/sysctl.conf agregar vm.swappiness=10; así la próxima vez estará en este valor.
    • sysctl -w vm.swappiness=10 lo cambia en el momento.
  • Revisar el disco duro.
    • hdparm es un comando muy útil
    • Hacer una revisión con touch /forcefsck, así la próxima vez que inicie el sistema se hará una revisión del disco.

UNIX notes

grep -v “^$” filename > newfilename

lsof -P -i -n

tcpdump -i eth0 host 192.168.1.1

netstat -t -u -c

hdparm -t /dev/sda
Test hard disk reading speed

echo “foo” > /dev/tcp/192.168.1.2/25
send echo to socket network

awk ‘length>72’ file
list of lines that are longer than 72 characters

sudo mknod /dev/ttyS4 c 4 68
Add another tty device using mknod command

find ~ -name ‘*.mp4’ | xargs mplayer
play all mp4 files on home directory

a2ps –line-number=5 message.rb

stop process using bash ^Z
[2]+ Stopped
you can view these processes with $jobs
then you can refer them to %2
e.g. $kill %2
$bg %2
$fg %2

find . -name '*.txt' | xargs perl -pi -e 's/old_str/new_str/g'

~/jruby/bin/jruby -J-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=4000 -J-Xdebug dioneas.rb ../sample/ruby/philosophers.rb

find ./ -type d -name .svn -exec rm -fr {} +

rm !(b)…..removes all file but b

#disable ipv6
net.ipv6.conf.all.disable_ipv6=1
#sysctl -w
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

-Djava.net.preferIPv4Stack=true

Ghostscript

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -dNumRenderingThreads=3 -sOutputFile=output.pdf input.pdf
-dNOGC — NO garbage collection
-c “30000000 setvmthreshold” –30MB of RAM
-dPDFSETTINGS=/screen (screen-view-only quality, 72 dpi images)
-dPDFSETTINGS=/ebook (low quality, 150 dpi images)
-dPDFSETTINGS=/printer (high quality, 300 dpi images)
-dPDFSETTINGS=/prepress (high quality, color preserving, 300 dpi imgs)
-dPDFSETTINGS=/default (almost identical to /screen)

pdftk sales_report.pdf output SalesReport.pdf user_pw PROMPT

echo “test” | ssh user@192.168.0.138 ‘cat > file’

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

patch -p0 -i ~/fix.diff

sed -n 5647,6239p app.log > relevant.log


python -m SimpleHTTPServer 8000



(server)$ cat file.zip | nc -l 8888
(client)$ nc <server> 8888 > file.zip

SSH iptables

Siempre me gusta tener activado SSH pero es peligroso en maquinas expuestas a internet debido a los ataques de fuerza de bruta, por esto agregue una cadena a iptables(8) que limita el número de intentos a SSH desde una IP, además de registrar en el log del kernel los intentos fallidos.


#--Crea una cadena SSH-fal
/sbin/iptables -N SSH-fal


#--Una IP solo puede intentar 3 veces cada 100 segundos, los intentos fallidos van al log del kernel
/sbin/iptables -A SSH-fal -p tcp --dport 22 -m state --state NEW -m recent --set
--name SSH
/sbin/iptables -A SSH-fal -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 100 --hitcount 2 --rttl --name SSH -j LOG --log-prefix "IPTABLES> ssh intento fallido"
/sbin/iptables -A SSH-fal -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 100 --hitcount 3 --rttl --name SSH -j DROP

#--Carga las reglas definidas en SSH-fal
/sbin/iptables -A INPUT -j SSH-fal

¿Cómo compilar el kernel de linux?

Después de que varias personas me han consultado sobre cómo compilar el kernel, aqui está como lo compilo yo, las instrucciones no son muy explícitas porque sólo son mis notas. Esta forma de compilar el kernel la he usado siempre después de probar varias formas ésta es la que más me ha convencido y siempre me ha funcionado.

LINUX KERNEL
-----------------------------

se copia el archivo config que esta en /boot
se renombra el archivo como .config

hacer un ln -s en /usr/src/linux al directorio del kernel

en /usr/src/linux/Makefile:4
poner identificador en EXTRAVERION

2.6.17-2.6.24.3
en /usr/src/linux/fs/splice.c
cambiar

if (unlikely(!base))
break;
por

if (unlikely(!access_ok(VERIFY_READ, base, len)))
break;

==================================================

----RPMs-------------------

make mrproper!!!!!!!!!!

make oldconfig

make menuconfig

make all

make modules

make modules_install

make install

-------DEBIANS----------

make mrproper

make oldconfig

make menuconfig

make-kpkg clean

make-kpkg --initrd kernel_image kernel_headers

dpkg -i <kernel>.deb

dpkg -i <kernel_headers>.deb

Gravísima vulnerabilidad en linux

Una vulnerabilidad que según afecta desde el 2.6.17 al 2.6.24.1 me ha hecho reflexionar sobre calidad en software y full-disclosure, aunque supuestamente se hizó saber a algunos cuantos de esta vulnerabilidad antes de hacerse pública no deja de ser muy peligrosa.

Lo gravísimo de esta vulnerabilidad radica en que permite a un usuario común convertirse en root en menos de un minuto.
¿Así o más fácil?
Supuestamente la vulnerabilidad está en vmsplice.

http://www.securityfocus.com/bid/27704

La probe en fedora 7 con SELinux enforcing y * hard core 0 en limits.conf en el kernel 2.6.22.6-custom-24-09-2007 en una 686 y el exploit funcionó a la perfección, depués en el mismo sistema con 2.6.23.14-64.fc7 funcionó en dos de seis ocaciones. Para estas pruebas compile el exploit en el mismo kernel que lo probé.
Después ejecuté el exploit que previamente había compilado en el 2.6.22.6-custom-24-09-2007 sobre el 2.6.23.14-64.fc7 y el exploit sigue funcionando a la perfección.

Ya con 2.6.23.15-80.fc7 parece que esta vulnerabilidad ha quedado solucionada.

Algo que es de reconcer de la comunidad de software libre es lo rápido que ha actuado en esta ocasión y otras similares.

¿Y todo para qué? ¿Y todo para qué? Intocable

Nueva instalación de OpenBSD

instalaopenbsdAcabo de instalar OpenBSD en una máquina viejita. Lo gratamente sorprendente es lo rápido y divertido que fue el proceso, además la configuración fue muy rápida también.

dmesg de la maquina con OpenBSD


OpenBSD 4.1 (GENERIC) #1435: Sat Mar 10 19:07:45 MST 2007
deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: AMD-K6(tm) 3D processor ("AuthenticAMD" 586-class) 151 MHz
..........

Como oficialmente no tengo internet (lo tomo prestado de algún vecino), fue necesario hacer NAT con iptables desde mi lap con Fedora, todo lo que hice fue:

iptables -F
iptables -X RH-input
iptables -F -t NAT
iptables -A POSTROUTING -t nat -o eth1 -d 0/0 -j MASQUERADE
iptables -A FORWARD -t filter -o eth1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -t filter -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

y habilitar el bit de forward

Mi interfaz de internet en la lap es eth1(wireless con ip asiganada por el DHCP del 2wire del vecino 192.168.1.29), en la eth0(Ethernet cable 172.16.22.18).

En OpenBSD

ifconfig rl0 172.16.22.17 up

Crear el archivo /etc/mygate con 172.16.22.18

Acomodar el archivo /etc/resolv.conf para que quede así


search gateway.2wire.net
nameserver 208.67.222.222
nameserver 208.67.220.220
nameserver 192.168.1.254

después

sh /etc/netstart

y desde la máquina con OpenBSD


ping yahoo.com PING yahoo.com (216.109.112.135): 56 data bytes
64 bytes from 216.109.112.135: icmp_seq=0 ttl=55 time=102.880 ms
64 bytes from 216.109.112.135: icmp_seq=1 ttl=54 time=101.531 ms

Puse el OpenBSD 4.1 porque es el que tenia en el Apache de mi lap, así que lo instale por red con un cable cruzado.
Ahora ya con internet desde puffy(la máquina con OpenBSD) instale bash y ahorita estoy instalando xfce.

La foto de la instalación.

De ado izquierdo se ve el log del apache en la lap cuando el OpenBSD fue por los sets de instalación, de lado derecho la compu con OpenBSD.