.----------------------------.
| Permisses de Arquivos UNIX `-----------------------------------------------,
| Por MELEU <meleuzord@yahoo.com>                                     12/2001 |
`-----------------------------------------------------------------------------'




          ___ ___                     __                __ __
         |   |   |.-.---.-----.-----.|  |--.--.--.-.--.|__|  |_.--.--.
         |   |   ||     |__ --|  -__||    <|  |  |   _||  |   _|  |  |
         |_______||__|__|_____|_____||__|__|_____|__|  |__|____|___  |
                                                               |_____|
                        _______
                       |     __|.----.-----.-.---.-----.
                       |__     ||  __|  -__|     |  -__|
                       |_______||____|_____|__|__|_____|


                      <http://unsekurity.virtualave.net>




                          - = <   N D I C E  > = -

                        0. Intro
                          0.1. Changelog
                          0.2. ToDo

                        1. Identificaes

                        2. Permisses de Arqvivos
                          2.1. Permisses Bsicas
                          2.2. Permisses Especiais

                        3. Sobre Alguns Comandos
                          3.1. chmod
                          3.2. ls
                          3.3. find
                          3.4. test
                          3.5. Outros Comandos

                        4. Usando C
                          4.1. Informaes sobre Arquivos
                          4.2. Mudando Permisses

                        5. Esquemas teis

                        6. Referncias

                        7. Consideraes Finais

                        Apndice. Arquivos de Dispositivo


-------------------------------------------------------------------------------


1. Intro
   ^^^^^

   Como vocs podem ver isso  assunto bem NewBie mesmo, arrisco dizer que 
 um assunto de Wannabe Newbie. S estou escrevendo sobre isto pois quando
precisei saber detalhes sobre permisses de arquivos no encontrei nada em
portugus que me ajudasse muito (confesso que no procurei muito :P ).
E pode ser que esse texto venha a ajudar algum numa consulta rpida sobre
determinada permisso...
   Se voc j  aquele fuador tarimbado pode ser que voc no encontre
nenhuma novidade na parte que descrevo as permisses, porm a parte que
envolve C pode ser de alguma utilidade. ;)
   E se voc  elite, com certeza j sabe que no  bem vindo no unsekurity.

Agradecimentos: Nash (por tudo), module (aindo vou morar na sua casa), eSc2
(vulgo Escape Duplo), xf (se pedir por favor eu at fao :P ), Blind_Bard
(e nossa partida de D&D?!), Hekodangews (quer aprender, saia do IRC), klogd
(pela companhia nas altas madrugadas :) ), hts (pela dica do pulltheplug),
Zarro (simplesmente por ter vontade de aprender e correr atrs), Cs0 (meleca
 voc seu bundo! :P ) a minha namorada (por no reclamar de eu ficar horas
na frente do PC e por no me decepcionar debaixo dos lenis :-) ), ao pessoal
da mail list (cuja participao foi fundamental para a realizao deste texto,
me tiraram algumas dvidas), a um cara chamado Ademar <www.ademar.org> (por
ter dado uma lida no texto e ter me dado uns toques legais, aqui est a
atualizao), e a todos que ajudam a Scene (e que eu esqueci de mencionar) e
no deixam que ela suma!

   Aproveitando o espaco, a vai uma frase de uma camisa da 2600
<http://www.2600.com> que eu gostei muito:

                      "Hack to learn not learn to hack."


0.1. Changelog
     ---------

-> Correo de erros de portugus e acentuao das palavras;

-> Correo de algumas informaes erradas, incompletas, e/ou mal
explicadas, como por exemplo a parte que falo sobre C (agora est mais
organizadinho).

-> Os cdigos agora esto entre as tags do Phrack Extraction Utility;

-> Incluso da seo 1 "Identificaes";

-> Incluso da seo 5 "Esquemas teis" (bem bacaninha!);

-> Adicionados mais links no tpico 6. Referncias.


0.2. ToDo
     ----

   Coisas que faltam no texto para que eu o julgue completo:

-> Falar sobre o comando chattr;

-> Incluir informaes sobre ACL's (antes eu preciso aprender mais sobre isso);

-> Falar sobre outras system calls que tm alguma relao com permisses de
arquivo e manipulao de ID.


-------------------------------------------------------------------------------


1. Identificaes
   ^^^^^^^^^^^^^^

   Cada usurio cadastrado no sistema possui dois nmeros relacionados ao seu
login. Um  o UID (User IDentification) e o outro  o GID (Group
IDentification). Isso  porque o UNIX no considera o nome do usurio para
determinar suas permisses, ele s trabalha com nmeros, neste caso o UID e
o GID ou em outros casos o EUID (Efective User IDentification).
   Voc pode ver os ID's de um usurio digitando (adivinha!) "id" no prompt.

/* -=-=-= exemplo =-=-=- */
root@meleu:~# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy)
/* -=-=-= exemplo =-=-=- */

   Voc deve ter reparado que o UID do root  0. Qualquer pessoa (no
interessa o seu username) que tiver UID 0 ter PERMISSO TOTAL no sistema,
ou seja, nvel de super-usurio. Sempre que eu falar neste texto "nvel de
super-usurio" eu estou querendo dizer "UID igual a 0". Cada username
cadastrado no sistema precisa de um, e somente um, UID.
   D pra ver tambm que o root faz parte de vrios grupos. Logo conclumos
que um usurio pode ter vrios GID's, quer dizer, um usurio pode pertencer
a vrios grupos.

   Alm destes dois h tambm o EUID. Este  usado com arquivos que
contenham permisses especiais (explicadas no tpico 2.2). Voc vai entender
sobre EUID quando ler sobre arquivos com SUID, mais adiante.


-------------------------------------------------------------------------------


2. Permisses de Arqvivos
   ^^^^^^^^^^^^^^^^^^^^^^

   Primeiro devemos saber que todas as informaes sobre os arquivos vm de
uma estrutura chamada inode. O inode contm informaes sobre o UID e GID
do arquivo, as permisses do arquivo, o tipo do arquivo e o timestamp
do arquivo (informaes sobre a ltima modificao, ltimo acesso, etc).
Para ver o nmero do inode de um arquivo basta um "ls -i".

   Tambm devemos saber que as permisses possuem 3 "nveis":

+ Proprietrio: s pode ser exatamente 1, o dono do arquivo;
+ Grupo: engloba todos os membros de um determinado grupo;
+ Outros: se refere a qualquer pessoa que no seja o proprietrio e que no
          pertena ao grupo.

   O proprietrio de determinado arquivo/diretrio  responsvel pelas suas
permisses de acesso.

   Basta um "ls -l" para ver as permisses, o dono do arquivo e o grupo.
Vamos a um exemplo:

/* -=-=-= exemplo =-=-=- */
meleuzord:~$ ls -l
total 28
drwxr-xr-x   5 meleu    users        4096 Jul 25 10:26 GNUstep/
drwxrwx---   2 meleu    staff        4096 Dec 22 06:58 myprogs/
-rw-r--r--   1 meleu    users        4163 Nov 16 06:43 rfc1244.txt
drwxr-xr-x   2 meleu    staff        4096 Dec 28 16:09 mylibs/
-rw-------   1 meleu    users        1074 Dec 12 04:37 anotaes.txt
drwxr-x---   6 meleu    users        4096 Dec 28 16:12 textos/
/* -=-=-= exemplo =-=-=- */

   Note que todos os arquivos pertencem a "meleu" e uns arquivos pertencem ao
grupo "users" enquanto outros pertencem ao grupo "staff"
   As permisses so mostradas de fato depois do primeiro bit e sempre na
sequncia "rwx". O esquema  o seguinte, os 3 primeiros bits, depois do
primeiro, descrevem as permisses do proprietrio do arquivo; os 3 seguintes
dizem respeito ao grupo; e os 3 ltimos so referentes aos outros (que no
seja o proprietrio e nem pertena ao grupo). Note que em determinados itens
aparece um 'd' antes das permisses, isso significa que isto  um diretrio
(outros tipos so explicados no tpico 3.2.).


2.1. Permisses Bsicas
     ------------------

   Vamos falar sobre as permisses bsicas. So elas o 'r', 'w' e 'x'.
Tais permisses possuem significados diferentes quando aplicadas a arquivos
e a diretrios.

 * r - Read (Leitura):
   + Arquivo: significa que se pode ler o arquivo (atravs de um "cat" por
              exemplo.

   + Diretrio: significa que se pode ver o contedo do diretrio (atravs de
                "ls" por exemplo). Porm observe a explicao sobre a
                permisso de execuo mais abaixo.


 * w - Write (escrita, gravao)
   + Arquivo: significa que se pode adicionar contedo e alterar um arquivo.

   + Diretrio: significa que se pode criar e/ou apagar qualquer, repito
                QUALQUER, arquivo e/ou diretrio que esteja dentro deste,
                mesmo que no se tenha permisso alguma para o
                arquivo/diretrio a ser apagado. Observe a explicao sobre
                permisso de execuo abaixo e "sticky bit" em 2.2.
                Dica: NUNCA deixe o seu diretrio home com esta permisso para
                outros (tambm conhecida como world-writable).


 * x - eXecute (execuo)
   + Arquivo: pode-se executar o programa ou shell script (se um arquivo texto
              no for um script e tiver esta permisso e voc executar vai dar
              um monte de "command not found").

   + Diretrio: significa que pode-se "entrar" no diretrio. Esta permisso
                 importante quando atribuda a um diretrio. De nada adianta
                uma permisso 'w' se no tiver 'x'. J no caso do 'r' sem 'x'
                ainda podemos ver o contedo do diretrio, porm com algumas
                limitaes. Mas na hora de executar um "find" (tpico 3.3.)
                precisamos ter 'r' e 'x'.
                Veja o exemplo abaixo, observe as permisses do diretrio
                "pratica" (o comando "id" que aparece no comeo  apenas
                para mostrar "quem sou eu"):

/* -=-=-= exemplo =-=-=- */
meleuzord:/home/hack$ id
uid=1000(meleu) gid=100(users) groups=100(users)
meleuzord:/home/hack$ ls -l
total 20
drwxr-xr-x   5 hack     hack         4096 Jul 25 10:26 GNUstep/
drwxrwx---   2 hack     hack         4096 Dec 22 06:58 ferramentas/
drwxr-xrw-   2 hack     nogroup      4096 Dec 29 00:21 pratica/
drwxr-xr-x   2 hack     users        4096 Dec 28 16:09 progs/
drwxr-x---   6 hack     users        4096 Dec 29 00:51 textos/
meleuzord:/home/hack$ ls -l pratica/
/bin/ls: pratica/script.sh: Permission denied
/bin/ls: pratica/arquivo: Permission denied
/bin/ls: pratica/dir_teste: Permission denied
/bin/ls: pratica/mais_um_arquivo_teste: Permission denied
/bin/ls: pratica/arquivo_teste: Permission denied
total 0
meleuzord:/home/hack$ touch pratica/once_more_test
touch: pratica/once_more_test: Permission denied
/* -=-=-= exemplo =-=-=- */


   Vamos usar o "progs" da sada do comando "ls -l" acima para uma ilustrao,
vamos ver o que significa cada bit:

drwxr-xr-x   2 hack     users        4096 Dec 28 16:09 progs/

1: 'd' --> diz que  um diretrio;
2: 'r' --> mostra que o dono deste diretrio pode ver o seu contedo;
3: 'w' --> mostra que o dono deste diretrio pode criar e/ou apagar
           arquivos/diretrios que estejam dentro do diretrio "progs";
4: 'x' --> mostra que o dono deste diretrio pode entrar nele (atravs do
           comando cd)
5: 'r' --> mostra que qualquer integrante do grupo "users" pode ver o contedo
           do diretrio;
6: '-' --> mostra que integrantes do grupo "users" no podem criar e/ou apagar
           arquivos/diretrios que estejam no diretrio "progs";
7: 'x' --> mostra que integrantes do grupo "users" podem "entrar" no diretrio;
8: 'r' --> qualquer pessoa que no seja o dono do arquivo e nem pertena ao
           grupo "users" pode ver o contedo do diretrio;
9: '-' --> "outros" no podem criar e/ou apagar arquivos/diretrios que
           estejam no diretrio "progs";
10: 'x' --> "outros" podem "entrar" no diretrio.

    importante perceber que "outros" no significa "qualquer pessoa logada
no sistema". Como j foi dito, "outros" se refere a qualquer um que NO SEJA
o dono do arquivo E NO PERTENA ao grupo que o arquivo/diretrio est
atribuido. Estou enfatizando isso porque eu j me confundi uma vez por isso.
Vamos a um exemplo:

/* -=-=-= exemplo =-=-=- */
meleuzord:/home/hack$ id
uid=1000(meleu) gid=100(users) groups=100(users),102(hack)
meleuzord:/home/hack$ ls -l
total 20
drwxr-xr-x   5 hack     hack         4096 Jul 25 10:26 GNUstep/
drwxrwx---   2 hack     hack         4096 Dec 22 06:58 ferramentas/
drwxr-xrw-   3 hack     nogroup      4096 Dec 29 01:22 pratica/
drwx---r-x   2 hack     hack         4096 Dec 28 16:09 progs/
drwxr-x---   6 hack     hack         4096 Dec 29 00:51 textos/
meleuzord:/home/hack$ cd progs/
bash: cd: progs/: Permission denied
/* -=-=-= exemplo =-=-=- */

   Observe pela sada do "id" que eu (o usurio meleu) fao parte do grupo
hack, note tambm que o grupo hack no possui nenhuma permisso no diretrio
"progs" e o resto do mundo possui permisso 'r' e 'x'. Isso quer dizer que
as permisses so verificadas da esquerda pra direita, na sequncia
proprietrio -> grupo -> outros.

   O algoritmo desta verificao  mais ou menos assim:

Comeo
   Se usurio  dono do arquivo Ento
      permisses do dono do arquivo  atribuda ao usurio;
   Seno
      Se usurio pertence ao grupo do arquivo Ento
         permisses do grupo do arquivo  atribuda ao usurio;
      Seno
         permisses de outros  atribuida ao usurio;
Fim.


2.2. Permisses Especiais
     --------------------

   Foram estas permisses que motivaram minha pesquisa e a escrita deste
simples textculo (texto pequeno =] )... vamos a elas.
   Antes  importante que se saiba que para qualquer um destes atributos ter
efeito  necessrio permisso de execuo. Para o Sticky bit  necessrio
'x' para outros; para o SGID bit  necessrio 'x' para o grupo; e para SUID
 necessrio 'x' para o proprietrio.


 * t - Save Text Attribute (vulgo "sticky bit")
   + Arquivos: Retirado da manpage do chmod: "O 'sticky bit' no  descrito
               pelo POSIX. O nome deriva do significado original: manter o
               programa texto no dispositivo swap."
               Isto deve ser para que o programa seja carregado mais
               rapidamente quando executado vrias vezes.

   + Diretrios: significa que o usurio pode apagar apenas arquivos que ele
                 seja o proprietrio. Geralmente  usado em diretrios
                 "world-writable" (por exemplo /tmp) para que no seja
                 permitido que qualquer usurio apague arquivos que no lhe
                 pertenam.


 * s - Set ID Attribute
   Este atributo possui significados diferentes quando est relacionado ao 
proprietrio do arquivo e quando est relacionado ao grupo, assim como
tambm possui significados diferentes para arquivos e diretrios, em relao
aos arquivos voc deve saber que este atributo NO FAZ EFEITO em shell scripts
(j ouvi rumores de que antigamente funcionava, mas desde que me tenho como
fuador [1999] nunca vi isto). Em todos os casos ele funciona como um "tempero"
para a permisso de execuo.

   + SUID Attribute (relacionado ao dono do arquivo)
     - Arquivos: SUID significa Set-User-ID, ou seja ele atribui ao EUID 
                 (Efective User ID - ID Efetivo do Usuario) do usurio o UID
                 do proprietrio do arquivo quando o arquivo  executado e
                 somente durante a execuo do mesmo (logo, o arquivo precisa
                 ser executvel). Isso quer dizer que durante a execuo do
                 arquivo voc tem acesso a tudo que o dono do arquivo tem.
                 Mas lembre-se SOMENTE DURANTE A EXECUCAO DO ARQUIVO.
     - Diretrios: SEM EFEITO.

   + SGID Attribute (relacionado ao grupo)
     - Arquivos: SGID significa Set-Group-ID, ele atribui ao EGID (Efective
                 Group ID - ID Efetivo do Grupo) do usurio o ID do grupo
                 quando o arquivo  executado e (assim como no SUID) somente
                 durante a execuo do mesmo.
     - Diretrios: se form criados arquivos dentro deste diretrio o grupo
                   do arquivo ser o mesmo grupo do diretrio.
                   No entendeu? Vamos a um exemplo:

/* -=-=-= exemplo =-=-=- */
meleuzord:~$ id
uid=1000(meleu) gid=100(users) groups=100(users),102(hack)
meleuzord:~$ mkdir teste
meleuzord:~$ ls -l
drwxr-x---   2 meleu    users        4096 Jan  2 09:49 teste/
meleuzord:~$ chgrp hack teste
meleuzord:~$ chmod g+s teste/
meleuzord:~$ ls -l
drwxr-s---   2 meleu    hack         4096 Jan  3 12:44 teste
meleuzord:~$ cd teste/
meleuzord:~/teste$ touch arquivo.teste
meleuzord:~/teste$ ls -l
total 0
-rw-r-----   1 meleu    hack            0 Jan  2 09:50 arquivo.teste
/* -=-=-= exemplo =-=-=- */

Acho que voc percebeu que o arquivo.teste pertence ao grupo hack. :)

   Isso  tudo que eu sei sobre permisses de arquivos. Vamos agora a outro
tpico que est relacionado a permisses...


-------------------------------------------------------------------------------


3. Sobre Alguns Comandos
   ^^^^^^^^^^^^^^^^^^^^^

   Aqui coloco algumas informaes sobre a alguns comandos que esto
relacionados a permisses de arquivos.

3.1. chmod
     -----

   O chmod serve para que voc possa mudar as permisses de um arquivo, para
fazer isso voc deve ser o dono do arquivo (ou o root). Bom... No vou escrever
sobre como usar o comando, isso voc deve ver na man page, vou escrever sobre
um "mtodo" diferente de como us-lo.
   Se ligue na seguinte relao:

                x = 1
                w = 2
                r = 4

   Voc pode usar esta relao para alterar as permisses de arquivos. Preste
ateno na seguinte linha de comando:

               chmod 644 arquivo.txt
                     |||
   dono do arquivo <-'|`-> outros
                      `-> grupo

   Cada dgito diz respeito a um nvel. Repare que no comando acima eu usei um
6, isso quer dizer que eu estou dando permisso de gravao (w = 2) e de
leitura (r = 4) (4 + 2 = 6). Com o comando acima o "arquivo.txt" ter as
seguintes permisses: -rw-r--r--

   Veja esta tabela:

               ,-------,-----------,---------,
               | octal | permisso | clculo |
               |-------|-----------|---------|
               |   0   |    ---    |    0    |
               |   1   |    --x    |    1    |
               |   2   |    -w-    |    2    |
               |   3   |    -wx    |   2+1   |
               |   4   |    r--    |    4    |
               |   5   |    r-x    |   4+1   |
               |   6   |    rw-    |   4+2   |
               |   7   |    rwx    |  4+2+1  |
               '-------'-----------'---------'
OBS.: esta tabela s  valida para as permisses "bsicas" (rwx).

   Lembre-se de que cada dgito diz respeito a um nvel! Logo no comando dado
como ilustrao acima "chmod 644 arquivo.txt" est sendo setado ao dono do
arquivo a permisso de leitura e escrita e ao grupo e outros apenas a permisso
de leitura.

   Agora em relao as permisses "especiais". Observe a relao abaixo:

       Sticky Bit = 1
             SGID = 2
             SUID = 4

Veja um exemplo de um comando e a explicao de o que estamos fazendo:

                        chmod 4755 programa
                              ||||
      SUID bit '--s------' <--'||`--> permisso 'r-x' para outros
                               |`--> permisso 'r-x' para o grupo
permisso 'rwx' para o dono <--'

   Aps este comando o "programa" ter as seguintes permisses: -rwsr-xr-x


   O dgito relacionado s permisses especiais precisa ser o primeiro de
quatro. Isso porque o chmod considera dgitos ausentes como 0. Exemplo:

		$ chmod 4 arquivo.txt

		      equivalente a

		$ chmod 0004 arquivo.txt


   Outra tabelinha de lambuja:

               ,-------,-----------,---------,
               | octal | permisso | clculo |
               |-------|-----------|---------|
               |   0   | --------- |    0    |
               |   1   | --------t |    1    |
               |   2   | -----s--- |    2    |
               |   3   | -----s--t |   2+1   |
               |   4   | --s------ |    4    |
               |   5   | --s-----t |   4+1   |
               |   6   | --s--s--- |   4+2   |
               |   7   | --s--s--t |  4+2+1  |
               '-------'-----------'---------'

   Lembre-se: Os valores desta tabela so vlidos apenas para o primeiro
dgito de quatro, no comando chmod.


3.2. ls
     --

   Essa parte  s pra voc entender o que a sada de um "ls" significa.
Vamos repetir aqui o primeiro exemplo dado neste texto:

/* -=-=-= exemplo =-=-=- */
meleuzord:~$ ls -l
total 28
drwxr-xr-x   5 meleu    users        4096 Jul 25 10:26 GNUstep/
drwxrwx---   2 meleu    staff        4096 Dec 22 06:58 myprogs/
-rw-r--r--   1 meleu    users        4163 Nov 16 06:43 rfc1244.txt
drwxr-xr-x   2 meleu    staff        4096 Dec 28 16:09 mylibs/
-rw-------   1 meleu    users        1074 Dec 12 04:37 anotaes.txt
drwxr-x---   6 meleu    users        4096 Dec 28 16:12 textos/
/* -=-=-= exemplo =-=-=- */

   Como j foi dito, este 'd' no primeiro bit de algumas linhas significa
diretrio. Agora vamos a uma tabela com todas as possibilidades.

            ,-----------,---------------------------,
            | Caractere |       Significado         |
            |-----------|---------------------------|
            |     -     |     arquivo regular       |
            |     b     |   dispositivo de blocos   |
            |     c     | dispositivo de caracteres |
            |     d     |        diretrio          |
            |     l     |      symbolic link        |
            |     p     |          FIFO             |
            |     s     |         socket            |
            '-----------'---------------------------'

/* S umas informaeszinhas a mais... ;)
   Os dispositivos de blocos so perifricos (como um disco rgido, por
exemplo) onde os dados so lidos e gravados, no prprio dispositivo como
blocos (no disco rgido geralmente o bloco  de 1024 bytes). Nos dispositivos
de caracteres os dados so lidos ou gravados em sequncia e a I/O pode ser
feita como bytes separados (um terminal virtual  um exemplo de dispositivo
de caracteres). */

   Observe tambm que no final do nome do diretrio existe uma barra "/". Isto
acontece quando  dado o paramatro -F ao comando "ls", e geralmente existe um
alias que faz isso pra voc.  
Olhe uma tabela com outros caracteres que aparecem no final do nome para
facilitar a identificao:

                    ,---------,----------------,
                    | Smbolo |  Significado   |
                    |---------|----------------|
                    |    *    |   executvel   |
                    |    /    |   diretrio    |
                    |    =    |    socket      |
                    |    @    | symbolic link  |
                    |    |    |      FIFO      |
                    '---------'----------------'

   Agora em relao a permisses, permisses especiais pra ser mais especfico.
Como j foi dito anteriormente,  necessrio permisso de execuo para que
os atributos "especiais" tenham efeito. Portanto quando estes atributos esto
sendo usados e no esto fazendo efeito algum eles aparecem em maisculo.
Veja um exemplo:

/* -=-=-= exemplo =-=-=- */
meleuzord:~$ touch arquivo
meleuzord:~$ chmod 7000 arquivo
meleuzord:~$ ls -l arquivo
---S--S--T   1 hack     users           0 Jan  4 09:55 arquivo
/* -=-=-= exemplo =-=-=- */

   Se quiser saber mais sobre o "ls" olhe a pgina man.


3.3. find
     ----

   Este comando  uma beno! :) Realmente muito til e vale a pena voc dar
uma lida na pgina man.... Mas vamos aqui a uma introduozinha s para voc
ter um gostinho.

   Veja aqui uma lista dos argumentos mais usados:

Argumento          Descrio

-user <usurio>    procura por arquivos cujo dono seja <usurio>.
-group <grupo>     procura por arquivos cujo grupo seja <grupo>.
-name <padro>     procura por arquivos de nome que combine com o <padro>.
-type <tipo>       procura por arquivos do tipo <type>
-perm [-]<perms>   procura por arquivos de permisses <perms> (veja abaixo).

Nota-1: o parmetro <perms> precisa estar no formato octal, e se voc colocar
o '-' na frente o find procurar por arquivos que tenham *no mnimo* as
permisses <perms> (veja exemplos abaixo).
Nota-2: os tipos que so usados com o parmetro -type so aquelas letras
da tabela encontrada no tpico 3.2. (sobre ls), com a excesso do arquivo
regular onde  usado o caracter 'f'.

    interessante que voc use redirecionamento para poder consultar o
resultado da pesquisa. S pra lembrar: '>' redireciona a sada padro e
'2>' redireciona a sada de erro padro. Assim, uma boa  usar sempre
"2> /dev/null". ;)

   Vamos a alguns exemplos... para maiores detalhes... nem precisa falar n?!

+ procurar por arquivos suid ou sgid:
     find / -perm -4000 -o -perm -2000

+ procurar por arquivos suid do root executvel para todos (ou seja, bons
  arquivos para se colocar backdoors ;-) ):
     find / -user root -perm -4001

+ procurar por arquivos world-writable que no sejam links simblicos,
  nem dispositivos de caracteres, nem sockets, e nem que possuam o sticky
  bit (OBS-1: 0's a esquerda das permisses podem ser omitidos; OBS-2: a
  exclamao '!' serve para negao de tudo que est entre parnteses;
  OBS-3: o '-o'  o "ou lgico" do find)
     find / -perm -2  ! \( -type l -o -type c -o -type s -o -perm -1000 \)


   Eu uso muito o find para encontrar os suid files nos WarGames (ver
referncias), onde voc tem que encontrar o suid file do level superior ao
seu. Por exemplo, quando est no level3 e quer procurar o suid file do
level4, use:
     find / -user level4 -perm -4000 2> /dev/null



3.4. test
     ----

   Este comando  muito usado nos shell scripts. E d pra se fazer muita
coisa interessante com ele. No  o propsito deste texto ensinar
Shell Scripting, portanto se no entender procure outras fontes (inclusive em
<http://unsekurity.virtualave.net> ).
   Como voc deve saber (seno, fica sabendo agora :P ) o "test expresso"  a
mesma coisa que usar "[expresso]" e esta ltima notao que irei usar. Como a
pgina man explica tudo que se deve saber, no vou explicar sobre o test aqui.
Mas a vai um exemplo de script (o script  meio besta... somente para
ilustrao mesmo). No esquea de ler a man page.

/* ------------------------------ */
<++> Permissoes/perms.sh
#!/bin/bash

if [ $# -ne 1 ]; then
  echo "Uso: `basename $0` filename" 1>&2
  exit -1
fi

# -e verifica se o arquivo existe
if ! [ -e $1 ]; then
  echo "$1 no existe"

# -k verifica se possui sticky bit
elif [ -k $1 ]; then
    echo "$1 possui \"sticky bit\""

# -g verifica se possui SGID
elif [ -g $1 ]; then
    echo "$1 possui Set-Group-ID"

# -u verifica se possui SUID
elif [ -u $1 ]; then
    echo "$1 possui Set-User-ID"
fi

<-->
/* ------------------------------ */

   Agora basta aprender um pouquinho de shell scripting que d pra fazer
algumas coisas legais! ;)


3.5. Outros Comandos
     ---------------

   Aqui vai uma relao de alguns comandos que tem relao com permisses de
arquivos. D uma olhada na pgina man deles (o "umask"  explicado na pagina
man do bash, "man umask" lhe mostrar a man page da system call umask. Leia
tambm! ;-) ).

chown, chgrp, chattr, newgrp, su, id, sudo, suauth, umask.

   No momento s estou me lembrando destes... Devem haver outros.


-------------------------------------------------------------------------------


4. Usando C
   ^^^^^^^^

   Esta parte tem alguns pontos parecidos com a matria de lamagra na
CoreZine n. 1 (ver 6. Referncias). No me chame de copio! Acho que em
portugus no tem nada sobre isso, por isso resolvi escrever.


4.1. Informaes sobre Arquivos
     --------------------------

   Como j foi dito, todas as informaes sobre um arquivo fica numa
estrutura chamada inode. Para que possamos consultar estas informaes
atravs do C utilizamos as funes stat(), fstat() e lstat().
Aqui esto os prottipos e uma ligeira descrio:

       int stat(const char *file_name, struct stat *buf);
       int fstat(int filedes, struct stat *buf);
       int lstat(const char *file_name, struct stat *buf);

-> stat:  consulta informaes sobre file_name no inode e armazena na
          estrutura buf.
-> fstat: faz o mesmo s que ela acessa o arquivo atravs do inteiro
          filedes (file descriptor), como por exemplo o retornado por open()
-> lstat: faz a mesmssima coisa que stat porm quando o file_name  um link
          a funo stat() armazena em buf informaes sobre o arquivo
          apontado pelo link, j lstat() armazena em buf informaes sobre
          o prprio link.

   Como podemos ver na pgina man destas funes a estrutura stat est
definida da seguinte forma:

        struct stat
        {
            dev_t         st_dev;      /* device */
            ino_t         st_ino;      /* inode */
            mode_t        st_mode;     /* protection */
            nlink_t       st_nlink;    /* number of hard links */
            uid_t         st_uid;      /* user ID of owner */
            gid_t         st_gid;      /* group ID of owner */
            dev_t         st_rdev;     /* device type (if inode device) */
            off_t         st_size;     /* total size, in bytes */
            unsigned long st_blksize;  /* blocksize for filesystem I/O */
            unsigned long st_blocks;   /* number of blocks allocated */
            time_t        st_atime;    /* time of last access */
            time_t        st_mtime;    /* time of last modification */
            time_t        st_ctime;    /* time of last change */
        };

   Vamos agora analisar cada elemento desta estrutura.
st_dev: o dispositivo em qual o arquivo est gravado, para ver o "major and
        minor numbers" use as macros major() e minor() definidas em
        sysmacros.h. OBS.: Se voc no sabe o que isto significa
        leia o Apndice.
st_ino: o inode que guarda as informaes sobre o arquivo (cada arquivo
        est relacionado a um nico inode).
st_mode: serve para ver o tipo do arquivo (se  diretrio, dispositivo de
         bloco, etc) e tambm para ver as permisses. Para tais finalidades
         so necessrios alguns artifcios que veremos no cdigo abaixo.
st_nlink: nmero de hard links para o arquivo. O mnimo  1 (pelo menos
          se o arquivo existir :P ) a cada hard link soma mais 1.
st_uid, st_gid: ID do dono e ID do grupo, respectivamente (duh!).
st_rdev: se o arquivo  um dispositivo de bloco ou de caracteres o st_rdev
         ir armazenar os nmeros maior e menor do dispositivo.
         A diferena deste para o st_dev  que, por exemplo, o *arquivo de
         dispositvo* /dev/hdd est gravado (aqui na minha mquina) em 
         /dev/hda2, ento st_dev contm os nmeros "maior" e "menor" do
         /dev/hda2 ao passo que st_rdev contm os nmeros maior e menor
         do prprio /dev/hdd.
st_size: tamanho do arquivo em bytes (duh!)
st_blksize:  o tamanho do bloco que o sistema de arquivos usa para E/S,
             usado por alguns programas para que haja uma melhor
            "bufferizao".
st_blocks: o nmero de blocos fsicos que esto sendo usados por este arquivo
           no disco.
st_atime: contm o dia/ano/ms/hora/... do ltimo acesso a este arquivo
          (leitura e/ou execuo).
st_mtime: contm o dia/ano/ms/hora/... da ltima modificao feita no
          arquivo.
st_ctime: contm /dia/ano/ms/hora/... da ltima alterao feita *no inode*.
          Note que se voc modificar o arquivo voc estar alterando o inode
          tambm, mas se mudar o inode no quer dizer que esteja alterando o
          arquivo (ex.: atravs de chmod, chown, etc...). O que quero dizer 
          que se alterar st_mtime automaticamente alterar st_ctime, mas o
          contrrio nem sempre acontece.

   Bom... Acho que  melhor um cdigo-fonte de exemplo que assim  a melhor
maneira de pegar as coisas. ;) Muita ateno nos comentrios!

/* --------------------------- */
<++> Permissoes/filestat.c
#include <stdio.h>              /* Essa voc deve saber pra que serve. :P */
#include <sys/stat.h>           /* Necessaria para usar lstat() */
#include <sys/sysmacros.h>      /* Para usar major() e minor() */
#include <sys/types.h>          /* Para declarar varivel do tipo mode_t */
#include <time.h>               /* Para usar ctime() */

#define TRUE  1
#define FALSE 0
#define PERMS 07777

/* Como foi dito, a varivel st_mode armazena num s inteiro o tipo do
   arquivo e suas permisses. E  por isso que a gente precisa usar os
   bitmasks diferentes para quando queremos ver o tipo do arquivo e para
   ver as permisses do arquivo. A macro PERMS declarada acima  para se
   "traduzir as permisses. */

char *FileType (mode_t tipo);

unsigned short int isdev = FALSE; /* Isso  s pra verificar se o
                                     arquivo  um dispositivo. */

int main (int argc, char **argv) {
  struct stat arq;

  if (argc != 2)
    {
      printf ("Uso: %s <arquivo>\n", argv[0]);
      exit (-1);
    }

  if (lstat (argv[1], &arq))
    {
      perror (argv[1]);
      exit (1);
    }

  printf ("Nome do arquivo:\t%s\n", argv[1]);
  printf ("Inode:\t\t\t%d\n", arq.st_ino);
  printf ("Tipo do Arquivo:\t%s\n", FileType (arq.st_mode));

  if (!isdev) { /* Se NO for um dispositivo... */
      printf ("Tamanho:\t\t%d bytes, %d blocos\n", arq.st_size, arq.st_blocks);
      printf ("Bloco de E/S:\t\t%d bytes\n", arq.st_blksize);
      printf ("Dispositivo onde est salvo: \tmaior: %d,", major (arq.st_dev));
      printf (" menor: %d\n", minor (arq.st_dev));
  }
  /* Nos dois printf's acima e nos dois abaixo foram usadas as macros
     major() e minor(), ambas declaradas em <sys/sysmacros.h>, estas
     macros servem para retornar os nmeros maior e menor do dispositivo
     (Ver no Apndice mais sobre estes nmeros). */

  else { /* Se for um dispositivo... */
      printf ("Dispositivo verdadeiro: \tmaior: %d,", major (arq.st_rdev));
      printf (" menor: %d\n", minor (arq.st_rdev));
  }

  printf ("Permisses:\t\t%04o\n", arq.st_mode & PERMS);
  /* Olhe a a macro PERMS (que eu defini l no comeo) sendo usada. Ela
     est sendo usada aqui para ver as permisses no formato octal (ver
     tabelinhas do tpico 3.1.) portanto use sempre o formato "%o" para
     imprimir com printf() (de preferncia "%04o" para mostrar os 0's a
     esquerda). Lembre-se que sempre que for fazer esta "traduo" usar
     sempre 5 dgitos sendo que o primeiro dgito seja um '0', para que o
     compilador entenda que  um octal. */

  printf ("Numero de Hard Links:\t%d\n", arq.st_nlink);
  printf ("UserID: %d,\tGroupID: %d\n", arq.st_uid, arq.st_gid);
  printf ("ltimo acesso:\t\t\t%s", ctime (&arq.st_atime));
  printf ("ltima modificao:\t\t%s", ctime (&arq.st_mtime));
  printf ("ltima alterao no inode:\t%s", ctime (&arq.st_ctime));
  /* Nos 3 printf's acima usei ctime() para imprimir o
     timestamp bonitinho. */

  return 0;
}


char *FileType (mode_t tipo) {
  switch (tipo & S_IFMT) { /* Para saber o tipo do arquivo  necessrio usar
                              o S_IFMT. Detalhes sobre esta e outras macros
                              definidas em <sys/stat.h> podem ser vistos na
                              manpage do stat(). */
    case S_IFDIR:
      return "Diretrio";
    case S_IFREG:
      return "Arquivo Normal";
    case S_IFSOCK:
      return "Socket";
    case S_IFLNK:
      return "Link Simblico";
    case S_IFBLK:
      isdev = TRUE;
      return "Dispositivo de Bloco";
    case S_IFCHR:
      isdev = TRUE;
      return "Dispositivo de Caracter";
    case S_IFIFO:
      isdev = TRUE;
      return "FIFO";
    }
  return NULL;
}


/* * * EOF * * */
<-->
/* --------------------------- */

   Note que eu usei a funo lstat(), pois estou querendo informaes sobre
o prprio link (se o arquivo for um link!) e no sobre o arquivo apontado por
ele. Para se usar a funo fstat() voc faria algo mais ou menos assim
(s um trechinho):

/* -=-=-= usando fstat =-=-=- */
...
  int fd;
...
  fd = open(argv[1], O_RDONLY); /* isso normalmente fica dentro de um 'if' */
  fstat (fd, &arq);             /* e isso tambm ;) */
...
/* -=-=-= usando fstat =-=-=- */



4.2. Mudando Permisses
     ------------------

   Para mudar as permisses de um arquivo voc pode usar as seguintes funes:

       int chmod(const char *path, mode_t mode);
       int fchmod(int fildes, mode_t mode);

-> chmod: muda as permisses do arquivo/diretrio path setando para mode.
-> fchmod: igual chmod porm usando fildes (file descriptor) para mudar as
           permisses do arquivo.

   Em ambas funes voc usa o caminho do arquivo que voc quer modificar
como primeiro parmetro. E para "mode" (o segundo parmetro) voc deve usar
as macros definidas em stat.h ou um nmero octal de 5 dgitos (sempre de 5
dgitos!). Voc pode ver as macros na pgina man das funes stat.
   Evidentemente voc s pode mudar as permisses de arquivos que lhe
pertenam (a no ser que voc seja super-usurio).

   Para mudar as posses do arquivo (vulgo ownership) voc usa as seguintes
funes:

       int chown(const char *path, uid_t owner, gid_t group);
       int fchown(int fd, uid_t owner, gid_t group);
       int lchown(const char *path, uid_t owner, gid_t group);

-> chown: mudar a proprietrio do path para owner e o grupo para group.
-> fchown: mesmo esquema s que tem aquele lance do file descriptor.
-> lchown: mesmo esquema s que tem aquele lance de alterar o prprio link
           ao invs de alterar o arquivo apontado pelo link.

   Nestas funes o primeiro parmetro  o caminho do arquivo. O segundo e o
terceiro parmetro , respectivamente, o UID e GID que voc quer atribuir ao
arquivo. Quando voc no quer mudar o UID ou o GID  s voc usar -1.
   Ainda existem algumas limitaes:
   -> Apenas o super-usurio pode mudar o proprietrio do arquivo;
   -> O proprietrio do arquivo pode mudar o grupo do arquivo para qualquer
      um que ele faa parte;
   -> O super-usurio pode mudar o grupo do arquivo para qualquer um.

   Olhe este pequenino programinha (sem muita utilidade) s pra ver qual  o
esquema:

/* -------------------- */
<++> Permissoes/mudar_permissoes.c
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

#define PERMS 07777
#define GRUPO 666       /* O grupo que eu quero que o arquivo pertena */
#define MODE 04555      /* Permisses que eu quero que o arquivo tenha */

int main (int argc, char **argv) {
  struct stat arq;

  if (argc != 2) {
    printf ("Uso: %s <arquivo>\n", argv[0]);
    exit (-1);
  }

  if (lstat(argv[1], &arq)) {
    perror (argv[1]);
    exit (1);
  }

  printf ("ANTES:\n");
  printf ("\tOwnership -> UID: %d,\tGID: %d\n", arq.st_uid, arq.st_gid);
  printf ("\tPermisses: %04o\n\n", arq.st_mode & PERMS);

  if (lchown (argv[1], -1, GRUPO)) perror ("lchown");
  if (chmod (argv[1], MODE)) perror ("chmod");

  lstat (argv[1], &arq);
  printf ("DEPOIS:\n");
  printf ("\tOwnership -> UID: %d,\tGID: %d\n", arq.st_uid, arq.st_gid);
  printf ("\tPermisses: %04o\n", arq.st_mode & PERMS);

  return 0;
}
<-->
/* -------------------- */

   O programa mudar o grupo do arquivo para 666, se este GID no existir no
sistema o lchown no funcionar como desejado. O programa muda tambm a
permisso do arquivo para "r-sr-xr-x", ou se preferir: 4555, de acordo com a
macro MODE definida l em cima. Por exemplo: se voc quiser tornar um
arquivo/diretrio com acesso de leitura e execuo para todo mundo voc faria
o seguinte:
          chmod ("arquivo", 00555);
Nunca se esquea: so sempre 5 dgitos para ser certinho!


   Bom...  isso... teste uns esquemas ae e divirta-se. Com estas funes
d pra fazer uns lances bem legais pra voc verificar arquivos "perigosos"
com frequncia. Enfim... tenha imaginao!


-------------------------------------------------------------------------------


5. Esquemas teis
   ^^^^^^^^^^^^^^

   Vamos ver aqui umas coisinhas interessantes de se fazer usando SUID.
Antes vou logo avisando que para que as coisas mostradas neste tpico tenham
alguma graa voc ter que adquirir nvel de outro usurio. Se no sabe como
fazer isso... bem amigo... FUCE!

   Digamos que voc conseguiu acessar a conta de outro usurio. No perca
tempo! Copie um shell e atribua SUID a ele! Mas antes que voc comece a se
empolgar muito, isso no funciona com o bash nem com o tcsh.
   No exemplo abaixo imagine que eu seja "hack" mas consegui acessar a conta
do usurio "meleu" (no! isso no  crise de identidade!). Ento eu vou e
copio um shell e atribuo SUID a ele. Veja:

/* -=-=-= exemplo =-=-=- */
meleu:~$ id
uid=1000(meleu) gid=100(users) groups=100(users),666(hack)
meleu:~$ cp /bin/ash /tmp/exemplo
meleu:~$ chmod +s /tmp/exemplo
meleu:~$ ls -l /tmp/exemplo
-rwsr-sr-x    1 meleu    users       59628 Dec  9 23:47 /tmp/exemplo*
/* -=-=-= exemplo =-=-=- */

   Pronto. Agora eu entro no sistema como o usurio hack e... Veja voc
mesmo:

/* -=-=-= exemplo =-=-=- */
hack:/tmp$ id
uid=1005(hack) gid=100(users) groups=100(users),666(hack)
hack:/tmp$ ls -l exemplo
-rwsr-sr-x    1 meleu    users       59628 Dec  9 23:47 exemplo*
hack:/tmp$ ./exemplo
\u:\w$ id
uid=1005(hack) gid=100(users) euid=1000(meleu) groups=100(users),666(hack)
/* -=-=-= exemplo =-=-=- */

   Reparaste que o EUID mudou n? Reparaste tambm que o prompt do ash no 
bonito? :P
   Agora eu (hack) tenho acesso a tudo que meleu tambm tem. Mas felizmente
existem programadores que so pessoas preocupadas com a segurana e alguns
programas no funcionam quando voc est com EUID de outro usurio. Este  o
caso do programa "ps". Veja o exemplo:

/* -=-=-= exemplo =-=-=- */
\u:\w$ id
uid=1005(hack) gid=100(users) euid=1000(meleu) groups=100(users),666(hack)
\u:\w$ ps x
This /bin/ps is not secure for setuid operation.
/* -=-=-= exemplo =-=-=- */

   Sacaste?

   Este esquema eu testei no tcsh 6.08, bash 2.05, ash (no sei a verso),
zsh 3.0.6, e pdksh 5.2.12 (Public Domain Korn Shell). S funcionou no ash,
zsh, e pdksh.


   Agora se no tiver no sistema um destes shells "bons" (entre aspas :P ),
ainda tem outras coisas que voc pode fazer.
   Uma boa a se fazer  copiar e atribuir SUID a um editor de textos. S
testei este esquema com o "vi" (o editor mais fcil de se achar nos sistemas
que existem por a). Tendo um editor com SUID voc pode editar/criar
arquivos como se fosse o outro usurio. Consequentemente voc pode
editar/criar um profile para a "vtima", e quando falamos nisso logo
pensamos em (tchan tchan tchan!) Trojan Horses. E se voc tiver um editor
SUID para root voc pode mecher nos arquivos de configurao do sistema
(geralmente localizados em /etc ), visualizar o to cobiado /etc/shadow e
mais uma infinidade de coisas.
   Isso foi s um pontap inicial. No vou ensinar aqui como editar profiles
e nem como fazer Trojans. Mas posso te indicar onde aprender, para aprender
a fazer/editar profiles voc tem que aprender shell script e para aprender a
fazer Trojans voc tem que aprender a programar. Existem diversos textos
sobre o assunto, inclusive em http://unsekurity.virtualave.net (Veja mais em
6. Referncias).


                          -=> ALERTA <=-

   Se o administrador do sistema tiver um mnimo de competncia ele
rodar um find (ver tpico 3.3.) com frequncia para dar uma monitorada nos
arquivos SUID. Portanto no fique dando bobeira usando estes esquemas to
"fuleiros".
   E voc, administrador de sistema, fique alerta em relao aos arquivos
SUID do seu sistema. Permita apenas aqueles que so realmente necessrios.


-------------------------------------------------------------------------------


6. Referncias
   ^^^^^^^^^^^

Phrack Extraction Utility -> Para pegar  s ir no ltimo nmero da Phrack
                             em http://www.phrack.org

Dominando o Linux -> Foi onde li sobre as permisses bsicas e sobre
                     arquivos de dispositivo (do Apndice). Se quiser
                     comprar (o que no  nem um pouco necessrio) visite
                     http://www.lcm.com.br

Security-HOWTO -> Li sobre SUID, SGID, e sticky bit. Voc pode encontrar em
                  http://www.linuxdoc.org ou /usr/doc/Linux-HOWTOs

Bash-Prog-Intro-HOWTO -,-> Textos sobre shell script. teis para voc aprender
Adv-Bash-Scr-HOWTO ----'   a criar/editar profiles. Ambos se encontram em
                           http://www.linuxdoc.org ou /usr/doc/Linux-HOWTOs

Cursos de Linguagem C -> Dois timos lugares para se aprender a programar em
                         Linguagem C: (portugs)
                         http://ead1.eee.ufmg.br/cursos/C
                         e (ingls, muito bom! voltado especificamente para
                         ambiente UNIX)
                         http://www.cs.cf.ac.uk/Dave/C/CE.html

Bsico de Backdoors e TrojanHorses -> Um texto bem bacaninha que aborda estes
                                      temas pode ser encontrado em
                              http://unsekurity.virtualave.net/txts/bandt1.txt

Barata Eletrica n. 20 -> Tem um texto sobre UNIX e foi l que eu vi
                         aquelas tabelas do topic 3.2. A URL 
                         http://www.inf.ufsc.br/barata

CoreZine n. 01 -> Li sobre a parte de C. Voc pode encontrar a CoreZine em
                  http://www.digibel.org/~tompy/ezine.html

man pages -> Sobre as system calls e os comandos do tpico 3.

Linux Allocated Devices -> Maiores detalhes sobre os arquivos de
                           dispositivo. Voc pode encontrar em
                           /usr/src/linux/Documentation/devices.txt

www.lockabit.coppe.ufrj.br -,-> D uma olhada aqui se quiser saber mais
www.pulltheplug.com --------|   sobre wargames (OBS: vale a pena!!).
www.hackerslab.org ---------'

mail list da unsekurity -> Se no fosse a mail list esse texto seria um lixo
                           ou at mesmo nem sairia! =) (maiores informaes
                           em http://unsekurity.virtualave.net )


-------------------------------------------------------------------------------


7. Consideraes Finais
   --------------------

   Bem como esse texto  pro pessoal que est bem no comeo mesmo vou dar
uma dica em forma de relato "baseado em fatos reais". :P

   O lance  que quando eu comecei a estudar profundamente permisses de
arquivos eu comecei a fuar nos txts da vida e determinado assunto puxava
outro, e para compreender melhor o outro tinha que ler outro mais (arquivos
de dispositivo  um exemplo)... e por a vai... E de tanto ir saltando de
txt em txt eu acabava aprendendo um monte de coisa til.
   Onde quero chegar?!
   Estou querendo dizer que ao invs de ficar procurando ajuda em canais de
IRC voc tem que correr atrs das infos voc mesmo ou pedir indicao de um
txt pra algum... Voc acaba aprendendo muitas outras coisas!
    lgico que no  todo mundo que dispe de tempo pra ficar fazendo isso.
Portanto no pense que estou condenando quem fica pedindo ajuda... As vezes
precisamos de uma soluo rpida e talz... Mas conseguir aprender as coisas
por conta prpria a muito gratificante (pelo menos pra mim).
   Eu costumo apurrinhar o pessoal da mail list com dicas de leitura e outras
coisas... Se voc, fuador iniciante, fizer isso vai sair lucrando! Dividir
experincias com os outros faz a informao fluir mais facilmente e vai que 
algum j passou pelo mesmo problema que voc e encontrou um txt sarado
sobre o assunto! =] E se voc achar um txt/URL legal, no esquea de indicar
pra gente l no frum: http://www.unsekforum.cjb.net

   Vou terminando aqui... Um abrao irmos! E no se esqueam de ler as
man pages sempre que houver alguma dvida! ;)



-------------------------------------------------------------------------------

Apndice.
                         Arquivos de Dispositivo
                         ^^^^^^^^^^^^^^^^^^^^^^^

   Os arquivos de dispositivo so um artifcio para que os programas possam
interagir com os dispositivos de hardware atravs do kernel. Eles no so 
"arquivos" de verdade (ou so?). Mas os programas os usam como se fossem, e
assim o kernel reconhece a solicitao de E/S e envia para o driver
correspondente.
   Como vocs j sabem os arquivos de dispositvos ficam no /dev. Ao listar
o contedo do /dev com um "ls -l" voc ve algo incomum. Veja um exemplo:

/* -=-=-= exemplo =-=-=- */
meleuzord:~$ ls -l /dev/hda2
brw-r-----   1 root     disk       3,   2 Apr 27  1995 /dev/hda2
/* -=-=-= exemplo =-=-=- */

   Voc deve ter observado que o primeiro bit das permisses  um 'b' o que
mostra que  um dispositivo de bloco (ver tpico 3.2.). Mas no  disso que
falo quando digo "algo incomum". Estou falando so destes dois nmeros
separados por uma vrgula (3 e 2). O primeiro valor  o nmero maior (major)
do dispositivo e o segundo  o nmero menor (minor). Isso  para que o
kernel saiba que dispositivo est sendo usado. Quando um arquivo de
dispositivo  acessado o kernel recebe essa informao em forma de nmero
maior e nmero menor. O maior nmero especifica um determinado driver de
dispositivo do kernel e o menor nmero especifica exatamente qual dispositivo
ser controlado pelo driver.

   Olhe outro exemplo:

/* -=-=-= exemplo =-=-=- */
meleuzord:~$ ls -l /dev/hda*
brw-r-----   1 root     disk       3,   0 Apr 27  1995 /dev/hda
brw-r-----   1 root     disk       3,   1 Apr 27  1995 /dev/hda1
brw-r-----   1 root     disk       3,  10 Apr 27  1995 /dev/hda10
brw-r-----   1 root     disk       3,  11 Apr 27  1995 /dev/hda11
brw-r-----   1 root     disk       3,  12 Apr 27  1995 /dev/hda12
brw-r-----   1 root     disk       3,  13 Apr 27  1995 /dev/hda13
brw-r-----   1 root     disk       3,  14 Apr 27  1995 /dev/hda14
brw-r-----   1 root     disk       3,  15 Apr 27  1995 /dev/hda15
brw-r-----   1 root     disk       3,  16 Apr 27  1995 /dev/hda16
brw-r-----   1 root     disk       3,   2 Apr 27  1995 /dev/hda2
brw-r-----   1 root     disk       3,   3 Apr 27  1995 /dev/hda3
brw-r-----   1 root     disk       3,   4 Apr 27  1995 /dev/hda4
brw-r-----   1 root     disk       3,   5 Apr 27  1995 /dev/hda5
brw-r-----   1 root     disk       3,   6 Apr 27  1995 /dev/hda6
brw-r-----   1 root     disk       3,   7 Apr 27  1995 /dev/hda7
brw-r-----   1 root     disk       3,   8 Apr 27  1995 /dev/hda8
brw-r-----   1 root     disk       3,   9 Apr 27  1995 /dev/hda9
/* -=-=-= exemplo =-=-=- */

   Repare que o nmero maior de todos so iguais, isso quer dizer que para
todos estes dispositivos  usado o mesmo driver. O nmero menor indica ao
driver qual  o dispositivo que ele tem que executar sua funo.

   Para maiores informaes consulte a pgina man do comando mknod e o
arquivo /usr/src/linux/Documentation/device.txt


-------------------------------  E O F  ---------------------------------------
