<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.technet.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Desafio da Semana #12</title><link>http://blogs.technet.com/b/latam/archive/2006/11/03/desafio-da-semana-12.aspx</link><description>Por: Roberto Alexis Farah 
 
 Olá pessoal! 
 Tenho demorado para publicar novos artigos porque tenho usado meu tempo livre no desenvolvimento de duas ferramentas, uma delas pública que, em breve, vocês tomarão conhecimento através desse blog. ;) </description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>re: Desafio da Semana #12</title><link>http://blogs.technet.com/b/latam/archive/2006/11/03/desafio-da-semana-12.aspx#578769</link><pubDate>Tue, 02 Jan 2007 22:15:23 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:578769</guid><dc:creator>Roberto Farah</dc:creator><description>&lt;P&gt;Olá Weber,&lt;/P&gt;
&lt;P&gt;O código que você colocou é suscetível a buffer overflow sim. No ambiente CLR o risco de buffer overflow é bastante minimizado, entretanto, se você fizer chamadas para código não gerenciado via, por exemplo, C# ou VB.NET, você fica sujeito aos problemas típicos de código nativo.&lt;/P&gt;
&lt;P&gt;Esse artigo esclarece bem isso: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com//msdnmag/issues/04/04/securitybriefs/" target=_new rel=nofollow&gt;http://msdn.microsoft.com//msdnmag/issues/04/04/securitybriefs/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Em relação a Buffer Overflow em código nativo, como no exemplo que você colocou, há dois artigos meus falando sobre isso:&lt;/P&gt;
&lt;P&gt;Desafio Da Semana #8 - Crash - Buffer Overflow&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/latam/archive/2006/07/24/443173.aspx" target=_new rel=nofollow&gt;http://blogs.technet.com/latam/archive/2006/07/24/443173.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Desafio Da Semana #9 - Como explorar um Buffer Overflow&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/latam/archive/2006/08/11/446117.aspx" target=_new rel=nofollow&gt;http://blogs.technet.com/latam/archive/2006/08/11/446117.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;[]s,&lt;/P&gt;
&lt;P&gt;Roberto&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=578769" width="1" height="1"&gt;</description></item><item><title>re: Desafio da Semana #12</title><link>http://blogs.technet.com/b/latam/archive/2006/11/03/desafio-da-semana-12.aspx#578747</link><pubDate>Tue, 02 Jan 2007 21:42:12 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:578747</guid><dc:creator>Weber Ress</dc:creator><description>&lt;p&gt;Ol&amp;#225; ! Feliz 2007 !! :-)&lt;/p&gt;
&lt;p&gt;O c&amp;#243;digo abaixo &amp;#233; suscet&amp;#237;vel a Buffer Overflow, pois n&amp;#227;o estou verificando qual o tamanho de Name *antes* de copiar para NameBuffer, que possui um tamanho limitado.&lt;/p&gt;
&lt;p&gt;void SayHello(char * Name) &lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		char NameBuffer[256];&lt;/p&gt;
&lt;p&gt;		strcpy(NameBuffer,Name);&lt;/p&gt;
&lt;p&gt;		printf(&amp;quot;Hello %s&amp;quot;,NameBuffer);&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;Da forma que vc colocou no coment&amp;#225;rio anterior, como um ambiente CLR se protegeria de uma situa&amp;#231;&amp;#227;o como esta ? Entendi que o acesso direto a mem&amp;#243;ria &amp;#233; impedido atrav&amp;#233;s do CLR, mas este novo cen&amp;#225;rio seria tratado pelo CLR ?&lt;/p&gt;
&lt;p&gt;[]'s !!&lt;/p&gt;
&lt;p&gt;Weber Ress&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=578747" width="1" height="1"&gt;</description></item><item><title>re: DESAFIO DA SEMANA #12</title><link>http://blogs.technet.com/b/latam/archive/2006/11/03/desafio-da-semana-12.aspx#532845</link><pubDate>Tue, 28 Nov 2006 04:07:01 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:532845</guid><dc:creator>Marcondes</dc:creator><description>&lt;p&gt;Ol&amp;#225; Weber, tudo bem?&lt;/p&gt;
&lt;p&gt;a defini&amp;#231;&amp;#227;o da vari&amp;#225;vel str &amp;#233; do tipo string, um objeto gerenciado dentro do CLR. Como o par&amp;#226;metro do m&amp;#233;todo DoSomethind &amp;#233; do tipo string, e este &amp;#233; o &amp;#250;nico ponto de entrada para o m&amp;#233;todo, n&amp;#227;o estamos permitindo que haja qualquer tipo de acesso direto ao endere&amp;#231;amento do objeto string, o valor lido do par&amp;#226;metro (n&amp;#227;o importa o que seja) ser&amp;#225; interpretado como o tamanho total da string. N&amp;#227;o vamos ter problema de buffer overflow.&lt;/p&gt;
&lt;p&gt;[]&amp;#180;s&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=532845" width="1" height="1"&gt;</description></item><item><title>re: DESAFIO DA SEMANA #12</title><link>http://blogs.technet.com/b/latam/archive/2006/11/03/desafio-da-semana-12.aspx#532561</link><pubDate>Mon, 27 Nov 2006 22:59:45 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:532561</guid><dc:creator>Weber Ress</dc:creator><description>&lt;p&gt;Ol&amp;#225; Marcondes, td bem ?&lt;/p&gt;
&lt;p&gt;Da forma que vc definiu &amp;quot;str&amp;quot;, ela estaria vulner&amp;#225;vel a ataques de Buffer Overflow. Correto ?&lt;/p&gt;
&lt;p&gt;[]'s !&lt;/p&gt;
&lt;p&gt;Weber Ress&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=532561" width="1" height="1"&gt;</description></item><item><title>re: DESAFIO DA SEMANA #12</title><link>http://blogs.technet.com/b/latam/archive/2006/11/03/desafio-da-semana-12.aspx#510674</link><pubDate>Thu, 09 Nov 2006 21:29:48 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:510674</guid><dc:creator>Roberto Farah</dc:creator><description>&lt;p&gt;Oi Marcondes!&lt;/p&gt;
&lt;p&gt;Muito completo e did&amp;#225;tico seu post! Estou me perguntando se ainda preciso publicar a resposta. :)&lt;/p&gt;
&lt;p&gt;Obrigado&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=510674" width="1" height="1"&gt;</description></item><item><title>re: DESAFIO DA SEMANA #12</title><link>http://blogs.technet.com/b/latam/archive/2006/11/03/desafio-da-semana-12.aspx#496630</link><pubDate>Sat, 04 Nov 2006 18:18:50 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:496630</guid><dc:creator>Marcondes</dc:creator><description>&lt;p&gt;Ol&amp;#225; Farah!!!&lt;/p&gt;
&lt;p&gt;Aqui vai minha solu&amp;#231;&amp;#227;o&lt;/p&gt;
&lt;p&gt;PRIMEIRO SINTOMA:&lt;/p&gt;
&lt;p&gt;A premissa de que &amp;quot;sempre teremos o par&amp;#226;metro inicializado e com valores pronto para eu usar&amp;quot; &amp;#233; sempre a causa de problemas em runtime quando estamos com os aplicativos em produ&amp;#231;&amp;#227;o. Os cen&amp;#225;rios s&amp;#227;o sempre diferentes daqueles que pressupomos durante o desenvolvimento. Eu tenho comigo a seguinte premissa sempre: &amp;quot;toda vez que meu c&amp;#243;digo depender de dados externos, nunca irei confiar na sua origem&amp;quot;. Pode parecer um pouco absurdo, pq no caso de um m&amp;#233;todo de um programa que voc&amp;#234; mesmo desenvolveu e que voc&amp;#234; mesmo est&amp;#225; utilizando, a fonte dos dados &amp;#233; voc&amp;#234; :) portanto voc&amp;#234; n&amp;#227;o estaria confiando nem em voc&amp;#234;. Mas essa &amp;#233; a regra de ouro: voc&amp;#234; muita vezes acaba dando tiro no pr&amp;#243;prio p&amp;#233;, portanto, mais vale uma verifica&amp;#231;&amp;#227;o em c&amp;#243;digo do que uma bronca em produ&amp;#231;&amp;#227;o.&lt;/p&gt;
&lt;p&gt;O primeiro problema apresentado se encontra dentro do m&amp;#233;todo DoSomething(...). A verifica&amp;#231;&amp;#227;o if (0 == str.Length) { ... est&amp;#225; errada pois pressup&amp;#245;e que o par&amp;#226;metro str n&amp;#227;o seja nulo. Este teste apenas vale para testar se a string passada &amp;#233; vazia (string vazia n&amp;#227;o &amp;#233; igual a par&amp;#226;metro nulo). Portanto, para resolver este problema, basta utilizarmos o m&amp;#233;todo est&amp;#225;tico da classe String que verifica para n&amp;#243;s se a string &amp;#233; nula. Assim, o trecho de c&amp;#243;digo novo ficaria assim:&lt;/p&gt;
&lt;p&gt;static bool DoSomething(string str)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;// Checa se string &amp;#233; nula/vazia.&lt;/p&gt;
&lt;p&gt; &amp;nbsp;if(String.IsNullOrEmpty(Length))&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; return false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;str = str.ToUpper();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;(......)&lt;/p&gt;
&lt;p&gt;SEGUNDO SINTOMA:&lt;/p&gt;
&lt;p&gt;O segundo sintoma &amp;#233; causado principalmente pelo desconhecimento de muitos desenvolvedores do funcionamento interno do interop COM .NET: no exemplo do c&amp;#243;digo postado, o objeto do word s&amp;#243; ser&amp;#225; liberado (se um dia for!!!!) quando o garbage collector coletar o wrapper .NET criado para realiza&amp;#231;&amp;#227;o das chamadas ao COM do word. Em outras palavras, o comportamento &amp;#233; n&amp;#227;o determini&amp;#237;stico e portanto voc&amp;#234; poder&amp;#225; ficar com recursos n&amp;#227;o gerenciados (no caso o objeto COM da inst&amp;#226;ncia do WORD) carregados na mem&amp;#243;ria. Quando o wrapper foi criado, internamento o objeto COM do WORD foi acionado (na verdade, o m&amp;#233;todo AddRef da interface IUnknown foi chamado), adicionando um contador para a inst&amp;#226;ncia Word criada. Pois bem, para liberar de vez o objeto, precisamos zerar a contagem de refer&amp;#234;ncia. Para fazer isso, precisamos utilizar o m&amp;#233;todo &lt;/p&gt;
&lt;p&gt;system.runtime.interopservices.marshal.finalreleasecomobject&lt;/p&gt;
&lt;p&gt;para liberar o recurso COM n&amp;#227;o gerenciado da mem&amp;#243;ria. Essa feature que eu estou utilizando, assim como a da string no caso 1, s&amp;#227;o recursos do framework 2.0.&lt;/p&gt;
&lt;p&gt;Assim, para liberar o objeto WORD, fazemos o seguinte:&lt;/p&gt;
&lt;p&gt;try&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;msWord = new Microsoft.Office.Interop.Word.Application();&lt;/p&gt;
&lt;p&gt;object saveChanges = false;&lt;/p&gt;
&lt;p&gt;object missing &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = null;&lt;/p&gt;
&lt;p&gt;msWord.Quit(ref saveChanges, ref missing, ref missing);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;catch(OutOfMemoryException ex)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;Console.WriteLine(&amp;quot;N&amp;#227;o h&amp;#225; mem&amp;#243;ria dispon&amp;#237;vel...&amp;quot;);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;finally&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;// Como liberar o objeto COM? ASSIM DESTE JEITO ;)&lt;/p&gt;
&lt;p&gt;System.Runtime.InteropServices.Marshal.Finalreleasecomobject(msWord);&lt;/p&gt;
&lt;p&gt;msword = null;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Lembrando que se estiv&amp;#233;ssemos no framework 1.1, poder&amp;#237;amos liberar o objeto da mesma forma s&amp;#243; que utilizando o m&amp;#233;todo ReleaseComObject dentro de um loop at&amp;#233; que o retorno do m&amp;#233;todo fosse zero (0) (isso pq o ReleaseComObject liberava apenas uma refer&amp;#234;ncia do contador).&lt;/p&gt;
&lt;p&gt;&amp;#201; isso a&amp;#237; Farah!&lt;/p&gt;
&lt;p&gt;Super abra&amp;#231;o!&lt;/p&gt;
&lt;p&gt;Marcondes &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=496630" width="1" height="1"&gt;</description></item></channel></rss>