Archives for Sem categoria category

Ataques a gerenciadores de pacotes

Posted on jul 14, 2008 under Segurança, Sem categoria | No Comment

Para corrigir bugs e falhas de segurança recorremos as atualizações fornecidas pelos gerenciador de pacote da distribuição que utilizamos.
Mas se o gerenciador de pacotes não é seguro !!

Gerenciadores de pacotes rodam normalmente com acesso irrestrito, ou seja, como root para permitir modificação críticas no sistema. O gerenciador de pacote afeta o sistema inteiro e torna-se vital para a segurança e bom funcionamento do mesmo.

A universidade de Arizona analisou 10 gerenciadores de pacotes (APT, YUM, YaST, etc.).
E descobriu que é possível realizar um ataque conhecido como Replay Attacks.

Com esse ataque um invasor pode reproduzir corretamente as assinaturas dos pacotes ou metadados a partir de uma versão anterior. Fazendo com que os usuários instalem um pacote com BUG para o invasor explorar. Podendo abrir backdoors, ler ou apagar arquivos, sem comprometer senhas ou chaves de segurança.

Como se proteger

  • Usar Repositórios Confiáveis:. Use somente mirrors que pertencem a organização de confiança. Não escolha os repositórios randomicamente em uma lista de mirrors.
  • Atualiza manualmente seus sistemas (local e mirror caches):. Conheça o pacote e descubra quando as atualizações disponíveis e quais devem ser as versões. Verifique e instale manualmente os pacotes atualizados ao invés de utilizar atualizações automáticas.
  • Use repositórios com metadados assinados: Se o gerenciador de pacotes ou a distro ainda não assina os metadados, mas apenas pacotes, pelo menos exiga pacotes assinados até suportar metadados assinados.
  • Use HTTPS para comunicar com o mirror:Infelizmente suporte a HTTPS geralmente só está disponível para suporte pago (mas só protege contra um ataque conhecido como man-in-middle, não protege contra mirrors maliciosos).

Segundo a universidade do Arizona o problema pode ocorrer em ferramentas como yum e apt.

Referências:
Attacks On Package Managers
Study: Attacks on package managers

Gentoo atualiza Falha DNS (Envenenamento DNS)

Posted on jul 13, 2008 under Sem categoria | No Comment

Para todos que utilizam o BIND.
O Gentoo liberou a atualização para corrigir a falha Dns Cache Poisoning.

Comando para atualizar:

# emerge –sync
# emerge –ask –oneshot –verbose “>=net-dns/bind-9.4.2_p1″

Recomendações:

Para solucionar o BIND implementou a randomização da porta de pesquisa (source ports for query)
Então você precisa ter certeza que sua rede permite randomização de portas e que não tenha fixado a porta de pesquisa através da diretiva “query-source port” na configuração do BIND.

Referência
Gentoo alert 200807-08 (bind)

Post Mais lidos dessa semana

Posted on jul 10, 2008 under Sem categoria | No Comment

Nesta semana os seguinte post foram os mais lidos:

MANIFESTO EM DEFESA DA LIBERDADE

Posted on jul 10, 2008 under Sem categoria | No Comment

campamanhaA Petição pelo veto ao projeto de cibercrimes e o Manifesto “Em defesa
da liberdade e do progresso do conhecimento na Internet Brasileira”, em
menos de 2 dias, conseguiu 5564 assinaturas de acadêmicos, professores,
jornalistas, estudantes universitários, comunicadores e pesquisadores
brasileiros.

Pessoal Vamos Fazer um broadcast deste Post do Blog do Sergio Amadeu e assinar a petição online, Divulguem nos seus blogs avisem seus amigos, mande emails.

Assinem a petição online

Substituindo a recursão por uma pilha

Posted on jul 07, 2008 under Python, Sem categoria | 1 Comentário

Usar recursão para desenvolver um algoritmo deixa o código mais elegante e simples de entender. Mas perdemos a elegância e a simplicidade quando o algoritmo tem que ser debugado ou interpretado para solucionar um bug. Então neste post mostrarei dois exemplos para substituir a recursão por uma estrutura de dados conhecida como pilha ou LIFO (Last In First Out).

O primeiro exemplo é o algoritmo para cálculo do fatorial desenvolvi um classe que calcula o fatorial recursivamente def fatorialRecursive(self, x): e não recursivo def fatorialSimulateRecursive(self, x): o qual calcula o fatorial usando uma pilha, com esse método conseguimos calcular o fatorial de !1000 já com o método recursivo recebemos a seguinte exceção RuntimeError: maximum recursion depth exceeded. Eis uma vantagem de usar uma pilha ao invés de usar recursão.

#!/usr/bin/env python
#  -*- coding: iso-8859-1 -*-
#  This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#  This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# author: Marlon Petry
# Date: 2008/07/06
# Function: Remove Recursion with one Stack in python
#
class Stack:

     def __init__(self):
         self.stack = []

     def push(self,object):
         self.stack.append(object)

     def pop(self):
         if len(self.stack) == 0:
            raise "Error", "stack is empty"
         obj = self.stack[-1]
         del self.stack[-1]
         return obj

     def isempty(self):
         if len(self.stack) == 0:
            return False
         else:
            return True

class CalculusFatorial:
    stack = Stack()
    def fatorialRecursive(self, x):
        if x == 0:
            return 1
        else:
            return (x * self.fatorialRecursive(x - 1))

    def fatorialSimulateRecursive(self, x):
        factorial = 1;
        while x > 0:
            self.stack.push(x)
            x -= 1

        while self.stack.isempty():
            factorial *= self.stack.pop()

        return factorial

calc = CalculusFatorial()
print calc.fatorialRecursive(950)
print "Não recursivo"
print calc.fatorialSimulateRecursive(950)
calc.show()

O segundo algoritmo é a Torre de Hanoi, muito mais complexo para remover a recursividade fiquei uns dois dias tentando resolver até que encontrei um artigo que descreve como remover a recursão http://obelix.ee.duth.gr/~apostolo/TowersOfHanoi/index.html#non-recursive. Então segui os passos descritos no artigo e consegui chegar a solução.

#!/usr/bin/env python
#  -*- coding: iso-8859-1 -*-
#  This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#  This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# author: Marlon Petry
# Date: 2008/07/06
# Function: Tower Hanoi Remove Recursion with one Stack in python
#
import pdb
import sys

class Stack:

   def __init__(self):
       self.stack = []

   def push(self,object):
       self.stack.append(object)

   def pop(self):
       if len(self.stack) == 0:
          raise "Error", "stack is empty"
       obj = self.stack[-1]
       del self.stack[-1]
       return obj

   def isempty(self):
       if len(self.stack) == 0:
          return False
       else:
          return True

class Hanoi:
    stack = Stack()
    def hanoi(self,disk,src,dst,temp,tipo):
        if(disk == 1):
            print "Disk %d Move da haste %d para haste %d tipo %d" % (disk,src,dst,tipo)
        else:
	    #pdb.set_trace()
            self.hanoi(disk - 1 , src, dst, temp,1)
            print "Disk %d Move da haste %d para haste %d tipo %d" % (disk,src,temp,tipo)
            #pdb.set_trace()
	    self.hanoi(disk - 1, dst, temp, src,2)

    def hanoiNotRecursive(self,disk,src,dst,temp,tipo):
        flag = -1;

        while disk > 0:
 	    self.stack.push((disk, src, dst, temp,1))
	    disk = disk -1
	    flag += 1
	while flag >= 0:

	    disk,src,dst,temp,tipo = self.stack.pop()
	    flag -=1;
	    if disk == 1:
	    	print "Disk %d Move da haste %d para haste %d tipo %d" % (disk,src,dst,tipo)
            else:
		print "Disk %d Move da haste %d para haste %d tipo %d" % (disk,src,temp,tipo)
	    disk -= 1
	    while disk > 0:
	      self.stack.push((disk, dst, temp, src,2))
              disk = disk - 1
	      flag += 1

testeHanoi = Hanoi()
testeHanoi.hanoi(18,1,2,3,0)
print "Hanoi not recursive"
testeHanoi.hanoiNotRecursive(3,1,2,3,1)

Não cheguei a calcular o tempo de execução para ver se existe diferença talvez faça isso em um próximo post.

Estou participando do concurso Intel Moblin com o projeto Great Picture se achar interessante o projeto seu voto será muito bem vindo mais detalhes sobre o projeto aqui.

Como se pega vírus ?

Posted on jul 05, 2008 under Segurança, Sem categoria | 5 Comentários

As 5 maneiras para pegar vírus. Se você já fez alguma delas pode ter certeza que seu computador esta com vírus

1. Ir a sites porno

Geralmente esses sites abrem muitos pop-ups solicitam que instale o certificado de segurança. Cuidado pois se não pegar um vírus spyware com certeza irá pegar. Tem outros que pede para fazer uma conexão segura no tempo da internet discada e desconectava e discava para o exterior, imagina como ficava a conta de telefone.

2. Acessar sites Warez e Crack

Nestes sites é possível encontrar crack para quebrar programas, downloads de softwares completos e com certeza vírus, quem garante que o programa que você baixou não é um vírus.

3. Orkut, email, Msn

Quem nunca recebeu uma mensagem do tipo era você aqui.exe, te lembra dessa foto.exe, que flagra hein.scr, olha isso.pif. Essas mensagem são enviados por email, orkut, msn outras forma publiquei em um artigo anterior Pragas virtuais como se defender ?

3. Download por rede p2p

Exemplo você quer a música november rain do guns, manda pesquisar aparece em primeiro lugar novemberrain.exe você baixa e esta instalado o vírus. Sem mencionar que esses programas abrem várias portas tcp sendo um meio para invadir seu computador.

4. Download screensavers, toolbars, especialmente oferecida por pop-up

Todas as toolbars mesmo as legítimas como a do Google utiliza seu processador, então se instalar mais de uma com certeza sua navegação na internet ficará mais lenta, sendo que a grande maioria instala um monte de porcaria que é díficil de remover.

5. Download cursores animandos

Geralmente esses cursores trazem outros software junto com eles, como o whenU por exemplo é um software que monitora seus hábitos na internet e oferece propagandas não solicitadas.

Essas são as mais conhecidas. Faça um teste instale uma máquina virtual e execute todas ou algumas para ver se consegue se infectar com um vírus.

Boa Sorte.

Great Picture Moblin Concurso

Posted on jul 02, 2008 under Dicas Linux, Novidades, Sem categoria | 2 Comentários

Olá Pessoal

Estou participando do concurso da Intel que irá escolher os 10 melhores softwares que serão desenvolvidos para os MIDS Moblin com processador Atom.

O meu projeto é um software de edição de Fotos chamada Great Picture, pois os MIDS Moblin possuem câmera, gps, acesso a internet e muito mais. A idéia deste software é permitir a edição de uma fotografia onde poderá ser ajustado o brilho, contraste, gamma, cores, inserido um texto, colocado uma moldura pré-definida e também catalogar a fotografia colocando as coordenadas fornecidas pelo gps e enviar a fotografia por email.

Caso você tenha mais alguma idéia (new feature), para este software deixe um comentário se for interessante posso incluir no desenvolvimento.

No momento estou começando a montar o ambiente de desenvolvimento sendo que este ambiente é voltado para distribuições baseadas em debian e eu utilizo Gentoo como desktop então em breve irei disponibilizar um tutorial de como instalar o Moblin SDK no Gentoo.

Acharam interessante a idéia então vote no projeto Great Picture.

Para votar acesse o site http://br-linux.org/moblin/

Antes de votar é necessário realizar o cadastro http://moblin.ihvweb.com/index.php/registercontrol/index/1264/portuguese

Depois de realizar o cadastro clique em ver entradas e Clique em Gostei dentro do projeto Great Picture.

Desde já agradeço
E se tiver uma idéia legal para adicionar ao projeto deixe um comentário.

Sequestro de Arquivos Parte 2 GPcode.ak

Posted on jul 01, 2008 under Sem categoria | No Comment

A um tempo atrás escrevi um post sobre sequestro de arquivos ? onde fala sobre um vírus que infecta o sistema operacional Windows e criptografa os arquivos. Após é solicitado que compre a chave de descriptografia para conseguir os arquivos novamente. Os cibercriminosos vendem a chave por $300.

O vírus é um arquivo Windows PE EXE que possui 8030 bytes de tamanho chamado GPcode.ak.
A kapersky recentemente desenvolveu uma ferramenta para auxiliar na remoção do vírus stopgpcode2.

No site http://www.viruslist.com possui uma descrição completa de como o vírus criptografa os arquivos, e como pode ser removido.

Para ficar longe dessas pragas crie uma máquina virtual rodando linux com a virtualbox download aqui da versão para Windows. Além de ser uma forma de aumentar sua segurança ao navegar na web é uma experiência e tanto usar uma máquina virtual.

C chat with sockets and thread

Posted on jun 28, 2008 under C, Sem categoria, Tutoriais | 2 Comentários

I developed a chat server in the C language and Python language The chat written in Python is posted here. Now I developed the chat using the C sockets and threads. The code developed in C follows the same principles of the code in Python. In C had to develop a double linked list to store the file descriptor of the socket, user name and nickname. This code was developed to the discipline of Distributed Systems.

#include

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include "listaDDE.h"
#define MYPORT 5800    // the port users will be connecting to

#define BACKLOG 10     // how many pending connections queue will hold
#define MAXLINE 1024
#define NUM_THREADS     50
fd_set rmask;
pthread_mutex_t mutexsum;
pthread_mutex_t mutexLogin;
int fd_max;
int maxfds;

int sockfd;
fd_set read_fds;
fd_set master;
nodo *root = NULL;
static int	read_cnt;
static char	*read_ptr;
static char	read_buf[MAXLINE];

static void *sendMensagem(void *arg);
void sigchld_handler(int s);
static void *sendALL(char msg[],int soks);
static void *sendMensagem(void *arg);
static void *newClientConnect(int arg);

void sigchld_handler(int s)
{
    while(waitpid(-1, NULL, WNOHANG) > 0);
}

void *sendALL(char msg[],int soks)
{
	nodo *aux = getFirst();
	while(aux != NULL)
	{
		int soc =aux->socket;

		if(soc != soks)
			{
	      	       		if(write(soc, msg, strlen(msg)) == -1)
		    			perror("send");
				printf("send %s %s\n",msg,aux->nick);

			}
		aux = aux->prox;
	}
}

void *sendMensagem(void *arg)
{
  char *buff;
  int fd = (*(int *) arg);
  int nbytes;
  char tmp[5000];

  printf("\nthread call %d",fd);
  newClientConnect(fd);
  printf("\n entry LOOP\n");
  nodo *cliente = busca(fd);

while(1)
{

     buff = (char *) calloc( MAXLINE,sizeof(char));
     if(FD_ISSET(fd,&master))
     {
         nbytes = recv(fd,buff, MAXLINE -1 , 0);
	 if(nbytes > 1)
	 {

	   if(!tmp)
	   {
		perror("alocation:");
		exit(-1);
	   }
           strcat(tmp, cliente->nick);
	   strcat(tmp, " >> ");
	   strcat(tmp, buff);
           sendALL(tmp,fd);
	 }
	 else
	 {
	       if (nbytes == 0) {
                       printf ("servidor: socket %d desligado\n",  fd);
               } else {
                       perror ("recv");
               }
              close (fd); // BYE!!
              FD_CLR( fd , &master);
	      removi(getFirst(),fd);
	      pthread_exit(NULL);
	  }

     }
     free(buff);

}

}

static void *newClientConnect(int arg)
{
	int fd = arg;
	pthread_t tid;
	struct sockaddr_in their_addr;
	char welcome[] = "Welcome Chat SistDistribuidos 0.1 \n";
	char msg1[] = "Login: ";
	char msg2[] = "NickName: ";
	char nome[100];
	char nick[100];
	int nbytes;
	socklen_t sin_size;

	pthread_mutex_lock (&mutexLogin);

		printf("\naccept \n");
		if (write(fd, welcome, sizeof welcome - 1) != sizeof welcome - 1) {
	   		perror("write:");
			exit(1);
		}		

		printf("write %s \n",welcome);
		usleep(1000);

		if (write(fd, msg1, strlen(msg1)) != strlen(msg1)) {

	   		perror("write:");
			exit(1);
		}

		printf("write %s \n",msg1);
		usleep(1000);
		if ((nbytes = recv(fd, nome, 100,0)) < 0) {
		perror("read:");
	        exit(1);
	   	return;
		}
		nome[nbytes -1] = '\0';
		printf("Read %d %s\n",strlen(nome),nome);
		usleep(1000);
		if (write(fd, msg2, sizeof msg2 - 1) != sizeof msg2 - 1) {
	        	perror("write:");
	   	exit(1);
		}

		if ((nbytes =recv(fd, nick, 100,0)) < 0) {
	  	perror("read:");
		 exit(1);
		}
		nick[nbytes-1]='\0';
		printf("Read %d %s\n",strlen(nick),nick);		

		inseri(&root,fd,nome,nick, inet_ntoa(their_addr.sin_addr));
		FD_SET(fd, &master);		/* listen to this socket too */

	printf("end welcome \n");

	pthread_mutex_unlock (&mutexLogin);

}

int main(void)
{
      // listen on sock_fd, new connection on new_fd
    int j,new_fd;
    struct timeval waitd;
    int nbytes;
    char buf[256];
    int fd_max; //numero maximo de descritores

    struct sockaddr_in my_addr;    // my address information
    struct sockaddr_in their_addr; // connector's address information
    socklen_t sin_size;
    struct sigaction sa;
    int yes=1;

    FD_ZERO(&master);
    FD_ZERO(&read_fds);

    pthread_mutex_init(&mutexsum, NULL);
    pthread_mutex_init(&mutexLogin,NULL);

    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    if ( setsockopt ( sockfd , SOL_SOCKET , SO_REUSEADDR , &yes , sizeof ( int ) ) == -1 )
    {
		perror ( " setsockopt " );
		exit ( 1 );
    }

    my_addr.sin_family = AF_INET;         // host byte order
    my_addr.sin_port = htons(MYPORT);     // short, network byte order
    my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
    memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);

    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof my_addr) == -1) {
        perror("bind");
        exit(1);
    }

    if (listen(sockfd, BACKLOG) == -1) {
        perror("listen");
        exit(1);
    }

    FD_SET(sockfd, &master);

    fd_max = sockfd;	

    int rc =0;	 

    int i = 0;
    int ret;

    int fd;
      waitd.tv_sec = 1;
      waitd.tv_usec = 0;

     while(1)
     {  

        read_fds = master;
        if (select (fd_max+1,  &read_fds, NULL, NULL, NULL)== -1) {
                perror ("select");
                exit(1);
        }

        int addrlen = sizeof (their_addr);
        if (( new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&addrlen)) == -1)  {
            perror ("accept");
        } else {

            FD_SET ( new_fd , &master);

            printf ("server : new connection %s socket %d\n",
                              inet_ntoa (their_addr.sin_addr),new_fd);

	    pthread_t tred;
	    rc = pthread_create( &tred, NULL,sendMensagem, (void *) &new_fd);
       	    if (rc){
        	printf("ERROR; return code from pthread_create() is %d\n", rc);
       		exit(-1);
            }

        }
      } 

pthread_mutex_destroy(&mutexsum);
pthread_mutex_destroy(&mutexLogin);

    return 0;
}

Header Double Linked List name ListaDDE.h

#include 
#include 
#include 

#define MAXBUFFER 2048

typedef struct cel
{
	int socket;
	char nome[50];
	char nick[50];
	char host[50];
	char buff[MAXBUFFER];
	struct cel *ante;
       	struct cel *prox;
}nodo;

nodo *getFirst();
nodo *getLast();
nodo *busca(int key);

void inseri(nodo **root, int socket,char nome[],char nick[],char host[]);

void removi(nodo *root, int socket);
void print (nodo *ini);

Implementation Double Linked List without use global variable

#include 
#include 
#include "listaDDE.h"

nodo *first = NULL, *last = NULL;

nodo *getFirst()
{
	printf("call getFirst()\n");
	return first;
}

nodo *getLast()
{
	return last;
}
void inseri(nodo **root, int socket, char nome[],char nick[],char host[])
{
	nodo *aux;
	//primeira inserção
	if(*root == NULL)
	{
		*root = (nodo *) malloc(sizeof (nodo));
		if(*root == NULL)
		{
			perror("erro de alocação\n");

		}
		(*root)->socket = socket;
		strcpy((*root)->nome , nome);
		strcpy((*root)->nick , nick);
	        strcpy((*root)->host , host);
		(*root)->prox = NULL;
		(*root)->ante = NULL;
		 first = (*root);
		last = first;

	}
	else
	{
		aux = (nodo *) malloc(sizeof (nodo));
		if(aux == NULL)
		{
			perror("erro de alocação\n");

		}
		aux->socket = socket;
		strcpy(aux->nome , nome);
		strcpy(aux->nick , nick);
	        strcpy(aux->host , host);

		aux->ante =last;
            	aux->prox = NULL;

                last->prox = aux;
            	last = aux;
		*root = last;
	}
}

void removi(nodo *primeiro,int dado)
{
   nodo *aux = primeiro;
   while(aux != NULL)
   {
       if(dado == aux->socket && aux == first) //Remove first element
      {

	 if(aux->prox != NULL)
	 {
		printf("!= null\n");
		aux->prox->ante = NULL;
	        first = aux->prox;
	 }
	 else
	 {
		printf("null\n");
		free(first);

		break;
	 }

      }
      else if(dado == aux->socket && aux->prox == NULL) //remove last
      {
      	 aux->ante->prox = NULL;
         last = aux->ante;
         free(aux);
         break;
      }
      else if(dado == aux->socket &&  aux->prox != NULL && aux->ante !=NULL) //remove middle
      {
      	aux->ante->prox = aux->prox;
         aux->prox->ante = aux->ante;
         free(aux);
         break;
      }

      aux = aux->prox;
   }
}

void print (nodo *ini)
{
   nodo *p = first;
   while(p != NULL)
   {   printf ("socket %d cliente %s\n", p->socket,p->nome);
	p = p->prox;    

   }
}

nodo *busca (int key)
{
   nodo *p = getFirst();
   int flag = 0;
   while(p != NULL)
   {
   	if(p->socket == key)
	{
		return p;
	}
	p = p->prox;    

   }
   return NULL;
}

In order to compile this code together use the follow command gcc -o chatserver server.c listaDDE.c -lpthread
Using On the server
./chatserver

On the client telnet ipServer 5800

Digg if you like it: Development of a chat with the C sockets and Threads

UPDATE: This code is avaible in http://github.com/petryx/

Quantos Computadores tem no Mundo ?

Posted on jun 28, 2008 under Novidades, Sem categoria | 1 Comentário

Uma recente pesquisa realizada pela Gartner informa que o número de computadores pessoais em todo o mundo já ultrapassou o marco de um bilhão de unidades e também que em 2014 teremos 2 bilhões de máquinas.
Fazendo uma relação com o número de habitantes do mundo que está aproximadamente em 6 bilhões de pessoas temos 1 computador para cada 6 pessoas.
A pesquisa ainda revela que esse crescimento acontecerá em países emergentes como BRASIL, Rússia, Índia e China.
Geralmente escutamos as pessoas falando que querem comprar um computador para ter acesso a internet, conectarem-se ao resto do mundo. Para que a conexão desejada seja possível a infra-estrutura de redes terá dobrar para suprir esta necessidade. Dobrar a capacidade também significa aumentar o número de profissionais na área de informática. Notamos que tudo terá que ser duplicado até 2014, ou seja, em 6 anos.

Read the rest of this entry »