[Powered by Google Translate] [Semana 10] [David J. Malan] [Harvard University] [Esta é CS50.] [CS50.TV] Tudo bem! Este é CS50, mas não por muito mais tempo. Este é o início da semana 10. Na quarta-feira temos o nosso teste, e depois próxima segunda-feira temos um bolo comemorativo como um círculo completo todo o caminho de volta de zero semana. Hoje, falamos de um dos meus temas favoritos, verdade seja dita - a de segurança e privacidade e as implicações de todo o hardware e software que todos nós usamos estes dias. Para ser honesto, há uma série de ameaças por aí que, se você realmente não parou para pensar sobre eles, eles são realmente muito assustador. Caso em questão - se algum de vocês já o download de um pedaço de software fora da Internet e instalado no seu computador, você já engajados em um grau significativo de confiança, certo? Não há nada de ter impedido o Skype, ou Chrome, ou qualquer peça de software você tenha instalado em seu computador, desde a simples exclusão de todos os arquivos do seu disco rígido; de carregar todos os arquivos do seu disco rígido para o servidor algum bandido; de ler todos os seus e-mails, a partir de interceptação de todas as suas mensagens instantâneas. Porque a realidade é hoje, com sistemas operacionais mais modernos há realmente não é muito de um muro entre os programas de software que instalar, e você e eu somos praticamente apenas o tipo de cruzar nossos dedos e tendo em fé que esse aplicativo que baixado de graça, ou que coisa que é 99 centavos, é realmente completamente benigno. Mas, como temos visto através de C, e agora PHP e JavaScript, com esta capacidade de nos expressar através de programação, você pode fazer mais qualquer coisa que você quer com um programa que um usuário a si mesmo poderia fazer. Então, hoje vamos nos concentrar sobre o assunto - não apenas algumas ameaças, mas também defesas. De fato, no mundo da segurança em geral, há um tipo de jogo de gato-e-rato, e Eu ouso dizer que os bandidos quase sempre têm uma perna para cima. Quando se trata de tomar partido de hardware e software em nossos próprios computadores pessoais, temos de perceber que um cara ruim simplesmente precisa encontrar um simples erro - uma exploração, um bug - em um pedaço de software que nós escrevemos ou está executando para que ele ou ela para assumir todo o nosso sistema. Por outro lado, nós - os bons - a necessidade de corrigir e corrigir todos os erros e evitar todas essas fraquezas. E assim, eu diria que, em geral, os bandidos têm a vantagem. Que classes como este e as classes subseqüentes são realmente sobre não são sobre o ensino como para travar as batalhas que esses bandidos fazem, mas são sobre como se proteger ou pelo menos como fazer uma decisão calculada que sim, eu sei que este pedaço de software poderia realmente ler cada um dos meus e-mails, mas eu estou bem com isso por causa do valor que me leva, por outro lado. Estou muito satisfeito de ser acompanhado por 2 das pessoas mais inteligentes que eu conheço - Rob Bowden e Nate Hardison. Rob está prestes a levar-nos para um passeio pelo menor nível de etiquetas de segurança - do compilador que, até agora, todos nós temos vindo a amar e confiar. Rob Bowden. [Aplausos] [Rob] Tudo bem. David tem praticamente tomado a minha lengalenga toda que eu estava indo para introduzir com, mas - Várias semanas atrás, você viu o exemplo de um ataque de estouro de buffer que é um exemplo de um hacker hacker em algum pedaço de software que eles não devem ser invadido. O outro lado desta é às vezes você tem um software que é malicioso em si. Ele não precisa mesmo de ser cortado. A pessoa que escreveu o software quer hackear você. Vamos apenas ir direto para o código, dar uma olhada no "login.c". Aqui, um programa bobo que valida um nome de usuário e senha combinação. Aqui você deve ser definitivamente ficar confortável com C novamente para o quiz. Primeiro, estamos usando cordas começar a descrever o nome de usuário, então nós estamos usando a corda get para pegar a senha, e então nós temos algumas verificações triviais de justo, é o nome de usuário "roubar"? E é a senha "thisiscs50"? Ou, é o nome de usuário "Tommy" ea senha "i <3javascript"? Se algum deles for o caso,  então nós estamos indo só para imprimir o "Sucesso", e então nós temos acesso. Caso contrário, vamos para imprimir "inválido login" e depois, é claro,  Como a memória malloc esboço cordas, o nome de usuário e senha que livre. Este é um programa de login trivial, e se você pensar sobre quando você entrar no aparelho, é bastante semelhante - ou até mesmo login em seu computador - há apenas alguns programa de login, que é o que lhe dá acesso. Aqui, acontece que temos hard-coded 'roubar', 'thisiscs50', 'Tommy', 'i <3javascript', mas provavelmente há algum arquivo em algum lugar do seu sistema operacional que tem uma lista de nomes de usuários que podem acessar o sistema e uma lista de senhas associadas com os nomes de usuários. Normalmente, as senhas não são apenas armazenadas em texto simples como este. Existe algum tipo de criptografia, mas isso vai fazer para o nosso exemplo. Vindo para o nosso compilador - vai ser muito simples. Precisamos especificar pelo menos algum arquivo que deseja compilar, E então aqui - estas linhas são apenas ler um arquivo de A. Ele lê o arquivo inteiro em um buffer grande, e, então, nulo terminar nosso buffer como sempre, e, finalmente, apenas compilar o arquivo. Nós não vamos olhar como compilação é realmente implementado, mas como uma dica, ele apenas chama Clang. Nós vamos usar este programa para compilar as coisas em vez de Clang. Um problema que começar é que vemos queremos compilar nosso compilador, mas se nós não vamos usar Clang, eu não sei o que eu vou compilar com. Esta é uma questão geral conhecido como carregando. Então, só desta vez, eu vou usar Clang para compilar nosso compilador. Se você pensar em GCC e Clang - esses programas, os compiladores estão sendo atualizados constantemente, e os compiladores são compilados utilizando GCC e Clang. Clang é apenas um grande C ou C + + programa, para que o compilador que eles usam para compilar que é Clang. Aqui, agora, estamos indo só para estar usando o nosso compilador para compilar nosso compilador, e podemos até dizer - '/ compilador.', 'compiler.c', 'compile.c', '-o compilador'. Observe que este é o comando exato eu corri antes - basta substituir Clang com '. / compilador'. E agora temos um outro compilador, mas é exatamente o mesmo. Ele apenas chama Clang. Nós vamos usar o nosso compilador para compilar o nosso programa de login. Okay - "login / compilador login.c-o.". Assim, a referência não definido "GetString". Tem um "-lcs50". Okay. Então agora eu tenho o nosso programa de login. Executá-lo - receber "Digite seu nome de usuário". Um exemplo foi roubar. Por favor insira sua senha - thisiscs50. E sucesso! Eu tenho acesso. Executá-lo novamente e inserir uma senha inválida - ou nome de usuário e senha inválidos - inválido de login. Okay. Nada de interessante sobre isso até agora. Mas, vamos dar uma olhada no login de novo - e este vai ser um exemplo um tanto trivial, mas vamos adicionar uma outra pessoa aqui e dizer: else if ((strcmp (nome, "hacker") == 0 && strcmp (senha, "LOLihackyou") == 0)) agora, printf ("Hacked Agora você tem acesso \ n!").; bem. Compilando isso - compilador login.c-o login-lcs50 - agora correndo-se - e se eu usar meu nome de usuário de hacker e senha LOLihackedyou - Será que eu digitar errado lá antes? No login.c-iHack - eu não cortado porque eu acho que fazer isso mais tarde. Okay. Recompilação. Re-running - hacker - LOLihackedyou - Hacked! Agora você tem acesso. Não parece ser a de que grande parte da diferença porque é a mesma verificação exata que eu estava fazendo para outros nomes de usuários e senhas. Além disso, a grande coisa é que se outras pessoas olham para esta login.c - dizer, se eu passar isso para meu parceiro, e eles abrem este arquivo, e ler isso, eles vão ver - bem, por que você tem essas linhas de código aqui? Esse obviamente não é algo que deve estar no seu programa. Em alguns programas - como qualquer software proprietário, que não é open-source - você pode nunca ver estas linhas de código. Algo como o Skype ou algo - por tudo o que você sabe, Skype está em seu computador e não é apenas uma combinação username senha específica que irá entrar para o Skype, de alguma forma especial. Nós não sabemos sobre ele, e as pessoas não sabem sobre isso, porque não consegue ler o código fonte para ver que não há este buraco. O que nós chamamos isso - embora este não é um exemplo muito inteligente - isso é chamado de uma porta traseira. Se você acha que da porta de trás de sua casa. Aqui, se eu validar com 'roubar' os nomes de usuário ou 'Tommy' que seria como usar a "porta da frente". Essa é a maneira que eu tenho que segura o login. Mas se eu entrar com esse nome de usuário e senha - em seguida, que está usando a "porta de trás". Não era a forma intencional para entrar no programa, mas ainda funciona. E as pessoas, em geral, não é suposto saber sobre essas portas de trás. Nós estamos indo para melhorar esta situação. Vamos reverter isso para a nossa login.c original, e vamos dar uma olhada no nosso novo compilador. Okay. Tudo aqui é exatamente o mesmo. Estamos lendo o arquivo inteiro em um buffer. Tudo aqui é o mesmo. Nós apenas compilou o arquivo. Mas agora eu tenho essa grande se aqui que diz que, se o arquivo que acontecer de eu ser a compilação é login.c, então eu fazer algo especial. O que é que algo de especial? Vejo aqui algumas cordas chamado 'hack', e olhando para estas linhas de código - estas são as mesmas linhas de código - Eu acho que eu fiz 'iHack "uso e não' ihacked 'antes - olhar para estas linhas de código, eles são as mesmas linhas exatas de código que eu tinha em login.c antes. Mas agora, em vez de tê-los em login.c, Vou colocá-los em meu compilador. Estas são as linhas de código que eu vou querer inserir login.c. Estas linhas de código - o tampão que originalmente mantinha minha login.c não é mais vai ser grande o suficiente, porque agora eu quero também inserir este hack no meio do meu programa. Tudo isso está fazendo é criar um novo buffer que é grande o suficiente - tanto para o arquivo original e as linhas extras de código - o corte - que eu quero inserir lá. Aqui está uma coisa a notar - char * pattern = "/ / negar-lhes acesso!" Se olharmos para trás, login.c, vemos aqui este comentário - negar-lhes acesso! Em login.c, este comentário parece completamente inócuo, para que você não suspeitar de qualquer intenção maliciosa com apenas este comentário. Mas, no nosso compilador, estamos indo olhar especificamente para esta linha de código, e, depois, quando encontrá-lo - estas linhas de código está inserindo nosso invadir essa posição. Então, nós estamos interagindo sobre o login.c inteiro, estamos inserindo que corte exatamente onde ele diz que negar-lhes o acesso, e depois vamos compilar - e não o original, login.c mas o login.c novo com esse corte inserida bem no 'negar-lhes acesso. Agora eu quero compilar meu novo compilador com que corte envolvidos. Eu não vou usar Clang, então vamos copiar o compilador que usamos antes e usar isso - assim, compilador compiler.c compile.c-o evil_compiler. Agora compilador nosso mal - se usarmos nosso compilador mal para compilar qualquer outro arquivo, o arquivo irá compilar como deveria. É completamente normal. Mas se usarmos nosso compilador mal para compilar-se - assim, / evil_compiler login.c-o login-lcs50. - olhando login.c novamente, não há absolutamente nada aqui. É nosso costume "se é ou roubar ou tommy em que estamos, outra coisa que está fora". Mas quando executar o nosso executável, isso vai funcionar como de costume. Correr novamente - hacker, LOLihackyou - Hacked! Agora você tem acesso. Basta olhar para login.c, você não acha que alguma coisa está errada. Mas o compilador que está sendo usado para compilar login.c é projetado especificamente para inserir este hack no programa. Nós só mudamos o nosso problema original. Originalmente, tínhamos essas linhas de código em login.c que se alguém olhou para eles, que seria como, por que são estes aqui? Agora, se alguém passa a olhar para o nosso compilador, eles vão olhar para estas linhas de código e dizer: porque são estes aqui? Então, não estamos completamente resolvido o nosso problema. Mas podemos usar essa idéia novamente. Dando uma olhada na nossa terceira versão do compilador, É a mesma idéia. Nós ler o arquivo inteiro em um buffer até aqui, Nós compilar o arquivo aqui, e eu tenho algum tipo de hack corda aqui, mas observar o arquivo que eu estou realmente cortar agora. Estou compiler.c hackers não login.c. Mas o que estou inserindo em compiler.c? Estou inserindo este código, que é o código exato em nosso compilador anterior, que foi feito para inserir código em login.c. Aqui é o nosso caso login.c arquivo strcmp e depois inserir em Hack Stuff login.c nosso. Este novo compilador se destina a criar um compilador que se destina a compilação de login maliciosamente. Vamos ver por que isso nos ajuda. Tudo o resto é o mesmo, por isso funciona exatamente como ele trabalhou com nosso compilador anterior. Estamos apenas a iteração sobre nossa compile.c inteiro. Mas agora, em vez de procurar "negar-lhes acesso", que estamos procurando "compilar o arquivo. ' Onde é compilar o arquivo? Olhando para o nosso compiler.c completamente inocente, É bem aqui na parte inferior. Este comentário - compilar o arquivo - mais uma vez, que parece completamente inócuo. Mas, em nossa versão maliciosa do compilador, vamos - bem antes que o comentário - inserir este código que se destina a inserir o código quando compilar login.c. Há uma série de níveis de engano aqui. Vamos realmente executá-lo. Mais uma vez, vamos copiar o nosso compilador original. Agora compilação, - compilador compiler.c compile.c-o evilest_compiler - e agora evilest_compiler. Mais maligno compilador - se usar isso para compilar nosso compilador, vamos realmente olhar. Evilest_compiler - trazendo-o, todo o caminho de volta para a versão 1 do nosso compilador - a versão 1 do nosso compilador que foi apenas ler o arquivo e compilá-lo. Aqui, sabemos que evilest_compiler - quando ele compila esse arquivo - vai inserir o código aqui antes de compilar o arquivo, e que o código vai exatamente como o código a partir da segunda versão do nosso compilador que fez isso. Este código, que se destina a entrar em login, vai ser inserido em nosso compilador compilador mais maligno. Vamos usar evilest_compiler para compilar nosso compilador. Agora vamos usar o compilador, voltar mais para entrar, e lembre-se este login.c não tem absolutamente nada suspeito nele. Mas, usando o nosso compilador para compilar login.c, rob, thisiscs50, sucesso. Vamos hacker de login, LOLihackyou, Hacked! Agora você tem acesso. Reconhecer que este era diferente da versão 2 do nosso compilador. O compilador que usamos - vamos voltar - cópia de login - vamos trazer nosso compilador de volta aqui. Remoção compilador mais maligno. Tudo o que nos resta agora é compilador. Se olharmos para compiler.c, não há absolutamente nada lá que parece malicioso de qualquer forma. Se olharmos para login.c, não há absolutamente nada aqui que parece malicioso de qualquer forma. Mas, quando usamos a nossa compilador para compilar login.c, temos a versão hackable de login.c. Quando usamos o nosso compilador para compilar uma nova versão do compilador, temos a versão hackable do compilador. Agora, se sair e distribuir nosso executável compilador, e ninguém vai saber que não há nada de malicioso sobre isso. Esta é realmente assim em - Eu não me lembro do ano - Ken Thompson, e ganhou o Prêmio Turing - Se você não estiver familiarizado com o Prêmio Turing, é quase sempre definido como a Prêmio Nobel de ciência da computação, então é assim que eu vou definir isso. Ken Thompson fez um discurso quando recebeu seu prêmio Turing chamado "Reflexões sobre Confiança Confiar". Basicamente, esta era a idéia de seu discurso. Mas em vez de nosso compilador, ele estava falando sobre GCC - apenas um compilador outro como Clang - e que ele estava dizendo é que, como o nosso login.c, nosso login.c parece relativamente inútil mas ele estava falando sobre o real UNIX login.c. Quando você acessar o seu aparelho, existe algum programa de login que está sendo executado. Esse foi o login que ele estava falando. Este foi basicamente a sua idéia. Ele disse que no GCC, ele, em teoria, poderia ter plantado um erro - não é um bug, mas um código malicioso - que ao compilar a função de login - o arquivo de login - iria inserir uma porta traseira para que ele pudesse ir para absolutamente qualquer sistema UNIX no mundo e faça o login com nome de usuário específico e alguma senha. Na época, o GCC foi praticamente o compilador que todos usado para qualquer coisa. Se alguém aconteceu para atualizar GCC, então eles recompilar GCC usando o GCC, e você ainda pode fazer uma versão má do GCC porque foi especificamente elaborado para reconhecer que ele foi recompilar o compilador. E se você nunca usar o GCC para compilar um arquivo login.c, em seguida, ele iria inserir essa porta traseira que ele poderia usar para acessar qualquer computador. Isso tudo era teórico, mas - que circunstância particular era teórico, mas as idéias são muito reais. Em 2003, houve um exemplo semelhante onde - vamos dar uma olhada neste arquivo, e isso não tem absolutamente nada a ver com isso, na verdade, mas o erro é semelhante. Este arquivo apenas define uma função chamada divisão. É preciso um argumento a, b um argumento, ea intenção é fazer um dividido por b. Mas ele faz algumas verificação de erros, assim sabemos que as coisas são estranhas se b acontece igual a zero. Se b é zero, então nós dividir isso em dois casos. Você já pode ver o bug. O primeiro caso - se a é zero, então estamos fazendo zero dividido por zero, e nós apenas dizer que é indefinida. O segundo caso - se a não for zero, então é algo como 1 dividido por zero, e nós só ligar que o infinito. Mais que devolva o usual, um dividido por b. E aqui, nós estamos correndo esses três casos, e nós realmente executar divisão - ele grita para mim - assim, ignorando as advertências do Clang - fim de não-void função - aparentemente eu não compilar este antemão. Retornar 0. Faça dividir - tudo bem. Com. Divisão /, vemos 3, Infinity, Infinity. Zero dividido por zero não deveria ter retornado infinito. E se você ainda não descobriu o bug ainda - ou não viu isso antes - vemos que estamos fazendo a = 0. Provavelmente nós significou a == 0. Provavelmente. Mas, este foi realmente algo que, mais uma vez, em 2003, o kernel do Linux - então o nosso aparelho usa o kernel do Linux - qualquer sistema operacional Linux usa o kernel do Linux - assim um erro muito semelhante a esta apareceu. A idéia por trás desse erro era - novamente, não foi apenas alguma função que foi chamado, e ele fez um pouco de verificação de erros. Havia algumas entradas específicas que esta verificação de erros - deveria ter sido assim, tudo bem, você não pode chamar esta função com um divisor de 0. Então, eu estou indo apenas para retornar algum erro. Exceto, que não era tão inocente como apenas a criação de um igual a 0. Em vez disso, esta linha de código acabou fazendo algo mais como usuário administrador =. Ou user = superusuário. Foi um inocente - à primeira vista - erro em que poderia ter sido apenas razoável que eu só queria relatar algo específico se o usuário passou a ser o administrador de superusuário. Mas, então, voltar a pensar sobre isso, a pessoa queria que parecesse como um simples erro de digitação, mas se esse código realmente tinha sido liberada, então você teria sido capaz de invadir qualquer sistema, passando uma bandeira específica - neste caso, b = 0 - e seria automaticamente o usuário que o administrador, e então ele tem controle total. Isso aconteceu em 2003. Aconteceu então que a única razão foi capturado foi porque aconteceu de haver algum sistema automatizado que percebeu a mudança nesse arquivo que nunca deveria ter sido alterado por um humano. O arquivo só deve ter sido gerado automaticamente. Aconteceu então que alguém tocou - bem, a pessoa que queria cortar tocou esse arquivo, eo computador travado que tocar. Então, eles mudaram isso e só mais tarde percebeu o desastre teria sido se este tinha saído para o mundo real. Você pode estar pensando que - voltando ao nosso exemplo compilador - ainda que não pode ver - olhar o código fonte - que nada em particular é errado, se nós realmente olhar para o código binário do compilador, veremos que algo está errado. Como exemplo, se executar as cordas funcionar - que está indo só para olhar sobre um arquivo e imprimir todas as cordas que pode encontrar - se corremos cordas em nosso compilador, vemos que uma cadeia de caracteres que ele encontra é este estranho - else if (strcmp (nome de usuário, "hacker") - blá, blá, blá. Se alguém passou a ser paranóico o suficiente para não confiar em seu compilador, eles poderiam executar cordas e ver isso, e então eles sabem que havia algo errado com o binário real. Mas, cordas foi, inevitavelmente, algo que foi compilado. Então, quem pode dizer que o nosso compilador não tem apenas um código mais especial que diz que, se cordas é sempre executado em nosso compilador, a saída não é tudo de que o código malicioso. A mesma idéia com se queremos dis-montar o arquivo - nós aprendemos que a montadora traz-nos do código de montagem de um código de máquina - podemos ir na direção oposta - objdump-d compilador - nos dará a montagem do nosso código. Olhando para isso, é muito enigmático, mas se quiséssemos, poderíamos olhar através deste e razão, espera, há algo acontecendo aqui que não deve estar acontecendo, e depois nós vamos reconhecer que o compilador está fazendo algo malicioso. Mas, assim como cordas, quem pode dizer que não era especial objdump-encaixotado. Basicamente, tudo se resume a você não pode confiar em nada. O ponto do papel que está sendo chamado de "Confiança Confiar" é em geral, nós confio nosso compilador. Você compilar o código e esperar que ele faça o que você pedir para ele fazer. Mas, por que você deve confiar no compilador? Você não escreveu o compilador. Você não sabe o que o compilador é necessariamente realmente fazendo. Quem vai dizer que você pode confiar? Mas, mesmo assim, bem, talvez nós podemos confiar no compilador. Há dezenas de milhares de pessoas que olharam para isso. Alguém deve ter reconhecido que algo estava acontecendo com o compilador. E se nós apenas ir um nível mais profundo? Poderia até ser o seu processador. Por mais ridículo que isso poderia ser possível, talvez haja algum funcionário desonesto da Intel que cria estes processadores que sempre que o processador percebe que você está executando algum comando que é feito o login no computador, o processador irá aceitar algum usuário específico e combinação de senha. Seria descontroladamente complicada, mas alguém poderia fazê-lo. Nesse ponto, se você realmente vai abrir o seu computador para olhar para o processador e usar um microscópio de reconhecer que esses circuitos não estão alinhados como devem ser? Ninguém jamais vai pegar esse erro. Em algum momento, você só tem que desistir e confiar em algo. A maioria das pessoas não confiar no compilador neste momento. Isso quer dizer que não necessariamente que você deve. Olhando para um vídeo um tanto infame - [Música dramática jogar] [É um sistema UNIX. Eu sei que isto.] [É todos os arquivos -] Ela disse: "É um sistema UNIX. Sei que isso." Substitua UNIX com o que o seu sistema operacional favorito é - ela poderia ter dito: "É um sistema Windows. Sei que isso." É uma declaração completamente sem sentido, mas, pelo que sabemos, ela passa a conhecer um porta dos fundos no sistema UNIX. Ela sabe alguma combinação de usuário / senha que vai realmente deixá-la fazer o que ela quer. Tudo bem. A moral de hoje é, basicamente, você não pode confiar em nada. Mesmo as coisas que você escreve - você não escrever o compilador. O compilador pode ser ruim. Mesmo se você não escrever o compilador, a única coisa que está executando o compilador poderia ser ruim. (Risos) Não há muito que você pode fazer. O mundo está condenado. Voltar para David! [Aplausos] [David] Obrigado. Isso foi realmente deprimente. Mas, na verdade, Rob está correto. Nós realmente não temos uma solução para isso, mas você está prestes a receber algumas soluções para algumas defesas mais comuns. Em antecipação a isso, o que Nate e eu tenho feito nos bastidores há é saber que há tantos laptops nesta sala, estamos cheirando todo o tráfego sem fio passar por este espaço para os últimos 20 minutos durante a palestra de Rob, então vamos fazer uma pausa 2 minutos aqui. Nate vai montar, e depois vamos falar sobre todas as coisas que se poderia encontrar. (Risos) Então, eu posso ter exagerado um pouco apenas por uma questão de drama, mas poderia ter sido cheirando todo o tráfego sem fio, porque de fato, é assim tão fácil. Mas também existem maneiras que você pode proteger contra isso, e assim, com que, Eu dar-lhe Nate Hardison. >> [Nate] Sweet. (Aplausos) [Nate] Obrigado, cara. Eu aprecio o grito para fora. Tudo bem! É a semana do jogo. Vocês estão animado? Esperemos que ele vai ser um grande jogo no sábado. Eu imagino que vocês neste momento - uma vez que você tem um teste na quarta-feira tudo sobre o código, e nós só sab através de uma palestra maravilhosa por Rob com um monte de código C nele - são talvez um pouco cansado de código. Nesta parte, não estamos realmente indo para tocar em qualquer código que seja. Nós só vamos falar sobre uma tecnologia que você usa todos os dias, muitas vezes para muitas, muitas horas por dia, e vamos falar sobre as implicações com a segurança que existem. Nós conversamos muito sobre a segurança ao longo do semestre, e nós começamos com um pouco de criptografia. [Bdoh lv vwlqng!] E enquanto vocês estão provavelmente super-animado para estar passando notas para o outro em sala de aula usando uma cifra de César como esta, na realidade, há um pouco mais de diversão para ser tido quando você está realmente a falar de segurança e esse tipo de coisa. Hoje, nós estamos indo para cobrir algumas tecnologias que as pessoas realmente usar no mundo real para fazer todo tipo de coisas de sniffing pacotes pessoas para realmente entrar e invadir contas bancárias das pessoas e tudo isso. Estas são ferramentas legítimas de que estamos falando com a excepção de, eventualmente, uma ferramenta. E eu só quero fazer um aviso rápido. Quando falamos sobre essas coisas, nós estamos falando sobre eles para que você saiba o que está lá fora, e você está ciente de como ser seguro quando você está fora de usar o computador. Mas nós definitivamente não quer dizer que você deve usar essas ferramentas em seu dormitório ou sua casa, pois você pode correr em lotes de grandes questões. Essa é uma razão, hoje, que nós realmente não estavam cheirando seus pacotes. Tudo bem. Segunda-feira passada, falamos sobre os cookies, e HTTP e autenticação, e como Firesheep abre esta porta grande em sua conta do Facebook, a sua conta do Hotmail - se alguém ainda usa Hotmail - e muitas outras contas. Uma grande quantidade deste material vai construir fora do que, Mas, primeiro, eu quero fazer um tour rápido de como a Internet tem evoluído ao longo do tempo. Nos anos 90, vocês poderiam ter lembrado realmente ligar seus computadores com um destes. Agora nós não fazemos isso muito mais. Ele realmente se que, a fim de ligar um cabo Ethernet no meu laptop, Eu agora tenho que usar um destes adaptadores, que é uma espécie de loucura. Em vez disso, em 1997 tivemos esta tecnologia nova e divertida saiu que é conhecido como IEEE 802.11, por isso este é o padrão de internet sem fio O IEEE é este órgão que dá a todos os tipos de - publica todos os tipos de padrões com relação aos computadores. Os 802 padrões são todos sobre tecnologias de Internet. Então, 802.3, por exemplo, é o padrão de Ethernet, 802.15.1, creio, é o padrão Bluetooth, e 802,11 é tudo sobre Internet sem fio. Em 1997, este saiu. Ele não chegou a pegar imediatamente. Não foi até 1999 eo padrão 802.11b saiu que ficou muito popular. Como muitos de vocês se lembram quando os computadores começaram a sair e ficando wi-fi sobre eles? Isso foi legal, né? Lembro-me de meu primeiro laptop na escola, e tinha uma placa sem fio nela. Meu pai me deu e foi dizendo que eu deveria usá-lo para meus aplicativos da faculdade e de todos os que, e eu não tinha idéia de como eu ia procurar este material online. Mas, felizmente, eu tinha uma placa sem fio, de modo que foi muito legal. Hoje em dia, você também vai ver 802.11g, que é um dos outros realmente popular padrões sem fio que está lá fora. Ambos b e g são bastante desatualizado neste momento. Alguém sabe qual a versão maioria das pessoas estão neste momento se eles estão comprando novos roteadores sem fio e esse tipo de coisa? N. Exatamente. Bingo. E verifica-se que o padrão de corrente alternada está saindo de uma fase de projecto, e há outras versões sobre o caminho. Com cada um desses padrões que estamos ganhando mais largura de banda, mais dados a uma taxa mais rápida. Essas coisas continuam mudando muito rapidamente. Ele também faz com que nós temos que comprar mais roteadores e todas essas coisas divertidas. Vamos falar sobre o que realmente é a comunicação sem fio em seu núcleo. Com Ethernet e os velhos modems dial-up, você realmente tinha essa coisa que você conectado ao seu computador, e então você conectado a um modem do tipo, e então você plugado em uma tomada de parede. Você tinha essa conexão com fio, certo? O ponto inteiro de fio é se livrar dessas coisas. A fim de fazer isso, o que temos é essencialmente uma comunicação de rádio, onde o nosso roteador sem fio - designado pelo nosso pequeno ícone sem fio - está conectado à Internet com esta seta sólida indicando algum tipo de conexão com fio, mas quando você se conectar ao roteador sem fio você está realmente usando quase como um walkie-talkie entre o computador eo roteador sem fio. O que é realmente legal sobre isso é que você pode se mover. Você pode levar seu computador todo Sanders, vá navegar na web, o que você quiser, como você todos conhecemos e amamos, e você não tem que sempre ser conectado a nada. Para que isso funcione, temos tanto a recepção deste e de transmissão. É realmente como que walkie-talkie. Este roteador sem fio - que em Sanders está sentado debaixo deste estágio, aqui - é sempre transmitindo e recebendo, transmitindo e recebendo, e da mesma forma, os computadores estão todos fazendo esse tipo de coisa, também. Nós simplesmente não podemos ouvi-lo. A outra coisa que você pode fazer é que você pode ter vários computadores falando ao mesmo roteador sem fio. O mais próximo estiver de um roteador - e, novamente, esta é uma comunicação de rádio - quanto mais perto você estiver, melhor o sinal, melhor o seu computador 'ouve' o roteador e pode se comunicar com a Internet. Se vocês estão sempre em seu dormitório, em sua casa e você está se perguntando por que o seu sinal é ruim, provavelmente é porque a). você não está muito perto de seu roteador ou b). há algo entre você e seu roteador como uma parede de cimento ou algo que não deixa as ondas de rádio passam. Vamos falar um pouco sobre o porquê de bandidos como wi-fi. Bandidos amo wi-fi por alguns motivos. Aqui é o nosso cara desagradável ruim ali. Uma razão por que esse cara ruim ama wi-fi é porque, por padrão, um monte de roteadores wireless vêm e quando você configurá-los, eles estão sem criptografia. Este tem sido um problema, e tem havido casos - várias instâncias, agora - onde vilão mostra-se para a casa de alguém, percebe-se que há um sem criptografia Wi-Fi para que eles possam se conectar. Eles se conectam à internet wi-fi, e então começar a baixar todos os tipos de coisas divertidas. E eles não estão baixando gatinhos, não está baixando filhotes. Isto é como o BitTorrent. Esta é a desagradável do mais desagradável. Houve casos em que o FBI ainda se envolvido pensar que a pessoa que possui a casa é realmente o ir lá e baixando coisas que realmente não deveria ser. Tendo unencrypted wi-fi não é definitivamente algo que você quer fazer, se apenas para não ter o FBI vem bater à sua porta. Outra razão pela qual os maus amo wi-fi é a razão que David falei anteriormente durante o intervalo. Porque é uma comunicação de rádio em seu núcleo, se você souber o canal, você pode ouvir a estação de rádio. Por exemplo, se há um direito ruim lá sentado no meio à direita ao lado do ponto de acesso, bem próximo ao roteador sem fio, o bandido pode ouvir todo o tráfego sem fio que a partir de todos esses computadores. Na verdade, esses caras - esses poucos sortudos que estão aqui na fila da frente - porque eles são super-perto de todos esses roteadores sem fio que sentar-se logo abaixo do palco, eles seriam capazes de ouvir o tráfego de todos nesta sala inteira se você estiver conectado a internet wi-fi e começar a navegar através destes pontos de acesso. Não é muito difícil sentar-se em uma boa posição para farejar e descobrir o que os outros estão fazendo. É algo para se manter em mente, especialmente se você não tem certeza de onde o ponto de acesso é, e você está navegando, digamos, em um Starbucks. Acontece que sniffing e tudo isso não é realmente difícil de fazer. Há um programa chamado tcpdump que despeja todos os tipos de tráfego TCP e você pode executá-lo bastante simples - assim como eu fiz esta manhã. Aqui está um pouco de um despejo, e aqui está algum do tráfego que estava vindo minha rede no momento. Você pode ver - se você é vesgo realmente difícil - há um pouco de Spotify lá. No topo do tcpdump - porque este é um tipo de dor de usar - há um programa chamado Wireshark que empacota tudo isso em uma interface gráfica agradável. Wireshark é super-mão, assim se você passar a ter aulas de rede, esta é uma ferramenta que você vai amar, uma vez que ajuda a dissecar todos os pacotes que estão flutuando por aí. Mas pode também ser usado para o mal. É muito simples, basta baixar este programa, arranca, iniciar uma captura de rede, e ver tudo o que está acontecendo - e filtrar e fazer todo tipo de coisas divertidas com ele. A outra coisa que você pode fazer com a comunicação sem fio é não só você pode escutar, mas você também pode aprender a mexer com a rede e injetar suas próprias informações para controlar a experiência que outras pessoas na mesma rede sem fio está começando. Vamos dar uma olhada nisso. Aqui está o Firesheep - que nós conhecemos e amamos desde a semana passada - o que é que a tecnologia de espionagem. Se, por exemplo, queríamos ativamente o nosso go bad guy e mexer com um desses computadores, neste cenário, temos um computador que tenta surfar para harvard.edu. O que acontece é, o primeiro computador envia uma mensagem para o roteador sem fio e diz: hey, eu quero ir www.harvard.edu visita. Digamos, por alguma razão, eles estão tentando obter informações sobre o jogo deste fim de semana. Cara ruim, já que ele está sentado bem no meio, bem próximo ao ponto de acesso, pode ver que a comunicação vem do computador no roteador, e ele sabe, "Aha! Alguém vai harvard.edu". (Maldosamente risos) Não vai ser esta latência enquanto a comunicação vai do roteador para a Internet para ir encontrar a página na harvard.edu - assim como vocês todos sabem depois de fazer o seu PHP Série de Exercícios - e assim o bandido tem um pouco de tempo, um pouco de janela, em que ele pode responder com algumas coisas. Vamos dizer que esse cara ruim, é claro, é uma Yaley. Ele responde com harvardsucks.org. Boo! Cara muito, muito mau! Yaley ruim! Ou, pior ainda, ele pode responder com isso. [Http://youtu.be/ZSBq8geuJk0]. Eu vou deixar vocês descobrir o que é. Esta é realmente uma tecnologia chamada Airpwn! que foi estreou em uma das conferências de segurança de alguns anos atrás. Com Airpwn! você é realmente capaz de injetar o tráfego de volta para a rede. Os computadores que estavam tentando ir para a Internet e tentar chegar a Google.com, para Facebook.com, para harvard.edu ver a resposta malicioso entrar e assumir imediatamente, ok, essa é a resposta que eu estava esperando e acabam recebendo o conteúdo de harvardsucks.org ou nameyourfavoriteshocksite.com, e você pode ver como rapidamente as coisas vão piorar. Todos esses tipos de coisas não pode ser feito com estas conexões com fio, pois com uma conexão com fio é difícil de espionar para o tráfego. Se eu sou um cara mau e em uma extremidade é o seu computador e do outro lado é o seu roteador - seu modem - a única maneira que eu possa entrar em entre essa conexão é realmente emendar o meu computador em algum lugar no meio ou fazer outra coisa com o roteador, a jusante algo assim. Mas com wireless, que pode ser tão fácil como sentada na fileira da frente de uma sala de aula, e você pode fazer todo tipo de coisas desagradáveis ​​para as pessoas na parte de trás. Vamos falar sobre como você pode defender algumas dessas coisas. As pessoas que desenvolveram os padrões sem fio - a - 802,11 eles não são pessoas burras por qualquer extensão da imaginação. Esta é uma tecnologia legal e quando estreou em 1999, eles saíram com este padrão chamado WEP. Você pode ver aqui quando você tenta e participar de uma rede sem fio, você tem todos os tipos de opções de segurança diferentes. Isso é um tipo de dor, porque há seis todos juntos e nunca realmente faz sentido que uma para participar. Este 1 no topo é o primeiro que veio com chamado WEP. WEP significa Wired Equivalent Privacy, creio eu, Não Wireless Encryption Protocol que é um equívoco comum. Porque tenta dar-lhe o equivalente a privacidade e proteção de segurança equivalente ao de uma rede com fio Com WEP que acaba acontecendo é, você tem uma senha simples e pouco que você digitar e que serve para criptografar todas as suas comunicações entre o seu computador eo roteador. Qual é o problema com WEP embora? A senha com WEP é muito curto, e também todo mundo usa a mesma senha exata,  e por isso é muito fácil de decifrar. Então, muito rapidamente as pessoas descobriram que o WEP era um problema, ea única razão que você vê-lo mostrar-se ainda sobre esse cara é pouco - existem alguns sistemas mais antigos que usam WEP - o que você deveria estar procurando são o WPA e WPA2 mesmo padrões que foram liberados mais tarde. Estes sistemas são um ir muito melhor em proteção na Internet sem fios. Dito isto, eles ainda têm algum Hackability. Existem ferramentas lá fora, que pode ir fazer isso. Uma coisa em particular que pode ser desagradável é que se você ligar e autenticado para um roteador sem fio e está usando algum tipo de comunicação criptografada, verifica-se que um hacker pode facilmente enviar um único pacote para desligar você do roteador, e uma vez que já desconectado, você podem então escutar - eles podem cheirar os pacotes como você tentar restabelecer a conexão com o roteador. E com essa informação que pode, então, entrar e descriptografar o resto de sua comunicação. Este não é de forma alguma qualquer tipo de seguro além de toda imaginação. A outra coisa que você pode fazer quando você está a criação de redes sem fio ou você está se juntando a eles é - você perceber que aqui quando eu estou juntando esta rede, ele pede para o nome da minha rede. Isso também é conhecido como o SSID. E você vê aqui que na direita eu tenho uma caixa que me mostra os SSIDs disponíveis. Há uma Universidade de Harvard, uma CS50 e CS50 uma rede pessoal. Agora, como muitos de vocês sabiam que havia uma rede de Pessoal CS50 redor? Alguns de vocês. Nem todos vocês. O problema com isso, é claro, é que se não colocarmos isto na nossa lista de SSIDs, ninguém teria sabido sobre isso mais provável. Espero. A menos que vocês estão tentando crack em nossa sem fio. Mas isso é algo que você pode fazer que é realmente importante quando você está configurando um roteador em casa. Isso provavelmente não vai acontecer por alguns anos para um monte de você, Mas tenha em mente que a manutenção dessa SSID de lá e também não nomeá-lo algo super comum ajudará mantê-lo mais seguro no longo prazo. Um casal final de coisas que você pode fazer. Um é HTTPS. Se você está em um Starbucks, se você estiver em uma área wi-fi público e você decidir fazer para acessar sua conta bancária, acessar seu Gmail, seu Facebook, certifique-se de que essas ligações estão indo por HTTPS. É uma camada adicional de segurança, uma camada adicional de criptografia. A única coisa a ter em mente aqui é, quantos de vocês já clicaram em que a tela grande, vermelho, que diz: "Este site pode ser ruim." Eu sei que tenho. É, provavelmente, quando você está navegando tudo para ir ver Pátria ou algo assim, certo? Sim. (Risos) É. Lá você vai. Nós sabemos quem está assistindo Pátria. Que a tela grande, vermelho ali muitas vezes indica que algo funky está acontecendo. Às vezes é apenas o site em si é inseguro, mas que mesmo tela grande, vermelho surge quando as pessoas estão tentando montagem de rede ataca em você. Então, se você ver que a tela grande, vermelho chegar em um Starbucks, não clique por ele. Más notícias. Bad News Bears. A última coisa que você pode olhar para é algum tipo de VPN. Este VPN está disponível através de Harvard - vpn.fas.harvard.edu - eo que isto significa é que, na verdade, estabelece uma conexão segura entre você e Harvard, funis de tráfego do seu meio-lo, e de que maneira se você está sentado em um lugar como a Starbucks você pode conectar-se a Harvard, conseguir que o tráfego seguro, e depois procurar em Harvard. Novamente, não é infalível. As pessoas podem ficar no meio. Eles podem começar a quebrá-lo, mas isso é muito mais seguro do que confiam na segurança do sozinho wi-fi. Tudo bem. Em suma, quando você está a criação de redes sem fio, quando você está indo para usar sem fio em público - se é um Starbucks, se é Five Guys, se é b.good, algo assim - onde quer que eles têm wi-fi - estar ciente de seus arredores. Estar ciente de que as pessoas podem fazer. E ser seguro. Não acessar sua conta bancária. Poderia ser um violento despertar se alguém aparece com a senha mais tarde. Com isso, vá vermelho! E eu vou virar as coisas de volta para David por uma palavra final. (Aplausos) [David] Eu pensei que eu iria partilhar uma coisa com a experiência pessoal. Uma ferramenta que você pode gostar de jogar com - embora a Apple praticamente erradicada esta questão Se você já atualizou o seu software uma vez que - mas para este fim de realmente não ser capaz de confiar em software que usamos, e pontos de Nate, sendo capaz de farejar um pouco do que as outras pessoas estão fazendo lá fora - este era um pedaço de software que saiu cerca de um ano atrás-e-um-metade agora. [IPhoneTracker] [http://petewarden.github.com/iPhoneTracker/] Por algum tempo, o iTunes - antes iCloud, quando você estava sincronizar seus iPods ou iPhones ou seus ou de seus iPads com o iTunes - no interesse de backups, o que o seu iPhone e estes outros dispositivos vêm fazendo há algum tempo é fazendo uso de dados de GPS. Todos sabem, talvez, que os seus iPhones e Androids e Windows Mobile e como nos dias de hoje pode acompanhar onde você está no interesse de mostrar-lhe mapas e similares - bem o que a Apple e essas empresas fazem é eles normalmente acompanhar quase todos os lugares que você realmente sido do interesse de melhoria da qualidade de serviço. Um, você pode receber mais publicidade segmentada e similares, mas dois, eles também podem descobrir onde há hotspots sem fio do mundo, e isso pode ajudar com geo-localização - uma espécie de triangulação da posição das pessoas. Para encurtar a história, todos nós tínhamos andado antenas para uma certa quantidade de tempo. Infelizmente, a Apple tinha tomado a decisão de projeto - ou a falta dela - para não criptografar esta informação quando estava sendo backup para o iTunes. E o que o pesquisador de segurança descobriu foi que este foi apenas um grande arquivo XML - um arquivo de texto enorme - sentado em software pessoas iTunes, e se você fosse apenas um pouco curioso, você poderia ir picando em torno da história de seu cônjuge, a história da sua colega de quarto, a história do seu irmão e semelhantes, e graças a algum software livre, você pode traçar todas essas coordenadas GPS - latitude e longitude. Então, eu realmente fiz isso com o meu próprio telefone. Liguei no meu telefone, e com certeza, a minha versão do iTunes não foi codificado na época, eo que eu era capaz de ver eram os meus próprios padrões. Aqui está os Estados Unidos e cada um desses círculos azuis representa onde aconteceu de eu ter sido ao longo desses meses anteriores de possuir este telefone particular.  Eu gasto um monte de tempo, é claro, no Nordeste, um pouco de tempo na Califórnia, uma viagem de curta duração para o Texas, e se você então ampliar esse - este é todo o tipo de multa e interessante, mas eu sabia que isso. A maioria dos meus amigos sabia disso, mas se você mergulhar no mais profundo, você ver onde eu passar a maior parte do meu tempo no Nordeste. Se você trancar em algumas cidades de aspecto familiar - este grande, mancha de tinta azul é essencialmente centrada sobre Boston, e então eu gastar um pouco de tempo nos subúrbios que saem de Boston. Mas eu também estava fazendo um pouco de consultar esse ano. E este ano é a costa leste, e você pode realmente ver-me e meu iPhone no meu bolso viajar para trás e para frente entre Boston e Nova York e Filadélfia ainda mais para baixo, assim como gastar um pouco de tempo de férias no Cabo, que é o braço pouco lá fora. Assim, cada um desses pontos representa algum lugar que eu tinha sido, e completamente desconhecido para mim, toda essa história estava ali, sentado no meu computador desktop. Se você diminuir o zoom - esta, na verdade, foi um pouco preocupante. Eu não tinha nenhuma lembrança de nunca ter sido, na Pensilvânia nesse ano. Mas apesar de um pouco mais sobre isso e eu descobri, oh, era na verdade a viagem e com certeza, o meu telefone tinha me pegou. A Apple já codificado esta informação, mas isso também é apenas prova de quanta informação está sendo coletada sobre nós, e como é fácil - para melhor ou para pior - é aceitável. Um dos take-aways espero de falar de Rob, de falar de Nate e visuais pequenas como esta hoje é apenas para ser tudo o mais consciente deste de modo que, mesmo que - como o ponto de Rob - uma espécie de nós estamos ferrados, certo? Não há muito o que podemos fazer quando se trata de algumas dessas ameaças, mas no final do dia, temos de confiar em algo ou alguém se queremos realmente usar essas tecnologias. Pelo menos podemos tomar decisões e decisões informadas calculados ou não devemos realmente estar verificando esta conta particularmente sensível ou nós realmente deve ser o envio de que um pouco suspeito mensagem instantânea  em um ambiente wi-fi como este. Então, com o que disse, apenas uma permanece quiz, uma palestra permanece. Vemo-nos na quarta-feira depois segunda-feira. (Aplausos e exclamações) [CS50TV]