<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title><![CDATA[[SecurityRatty] tag: errors]]></title>
    <link>http://securityratty.com/tag/errors</link>
    <description></description>
    <pubDate>Fri, 18 Jul 2008 08:34:12 +0000</pubDate>
    <generator>iRatty Engine</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <item>
      <title><![CDATA[Doctoring Photographs without Photoshop]]></title>
      <link>http://securityratty.com/article/343f81e5ef64999b63085fa59a40a0d8</link>
      <guid>http://securityratty.com/article/343f81e5ef64999b63085fa59a40a0d8</guid>
      <description><![CDATA[It's all about the captions : ...doctored photographs are the least of our worries. If you want to trick someone with a photograph, there are lots of easy ways to do it. You don't need Photoshop. You...]]></description>
      <content:encoded><![CDATA[<p>It's all about the <a href="http://morris.blogs.nytimes.com/2008/08/11/photography-as-a-weapon/?ref=opinion">captions</a>:</p>

<blockquote>...doctored photographs are the least of our worries. If you want to trick someone with a photograph, there are lots of easy ways to do it. You don't need Photoshop. You don't need sophisticated digital photo-manipulation. You don't need a computer. All you need to do is change the caption.

<p>The photographs presented by Colin Powell at the United Nations in 2003 provide several examples. Photographs that were used to justify a war. And yet, the actual photographs are low-res, muddy aerial surveillance photographs of buildings and vehicles on the ground in Iraq. I'm not an aerial intelligence expert. I could be looking at anything. It is the labels, the captions, and the surrounding text that turn the images from one thing into another. Photographs presented by Colin Powell at the United Nations in 2003.</p>

<p>Powell was arguing that the Iraqis were doing something wrong, knew they were doing something wrong, and were trying to cover their tracks. Later, it was revealed that the captions were wrong. There was no evidence of chemical weapons and no evidence of concealment. Morris's mockery of the sweeping interpretations made in Powell's photographs.</p>

<p>There is a larger point. I don't know what these buildings were really used for. I don't know whether they were used for chemical weapons at one time, and then transformed into something relatively innocuous, in order to hide the reality of what was going on from weapons inspectors. But I do know that the yellow captions influence how we see the pictures. "Chemical Munitions Bunker" is different from "Empty Warehouse" which is different from "International House of Pancakes." The image remains the same but we see it differently.</p>

<p>Change the yellow labels, change the caption and you change the meaning of the photographs. You don't need Photoshop. That's the disturbing part. Captions do the heavy lifting as far as deception is concerned. The pictures merely provide the window-dressing. The unending series of errors engendered by falsely captioned photographs are rarely remarked on.</blockquote></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/schneier/fulltext?a=agGdKK"><img src="http://feeds.feedburner.com/~f/schneier/fulltext?i=agGdKK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/schneier/fulltext?a=6dATMK"><img src="http://feeds.feedburner.com/~f/schneier/fulltext?i=6dATMK" border="0"></img></a>
</div>]]></content:encoded>
      <pubDate>Wed, 27 Aug 2008 03:27:27 +0000</pubDate>
      <category domain="http://securityratty.com/tag/photographs">photographs</category>
      <category domain="http://securityratty.com/tag/actual photographs">actual photographs</category>
      <category domain="http://securityratty.com/tag/captions">captions</category>
      <category domain="http://securityratty.com/tag/yellow captions influence">yellow captions influence</category>
      <category domain="http://securityratty.com/tag/powell">powell</category>
      <category domain="http://securityratty.com/tag/colin powell">colin powell</category>
      <category domain="http://securityratty.com/tag/change">change</category>
      <category domain="http://securityratty.com/tag/chemical weapons">chemical weapons</category>
      <category domain="http://securityratty.com/tag/photoshop">photoshop</category>
      <source url="http://www.schneier.com/blog/archives/2008/08/doctoring_photo.html">Doctoring Photographs without Photoshop</source>
    </item>
    <item>
      <title><![CDATA[E-voting vendor: Programming errors caused dropped votes]]></title>
      <link>http://securityratty.com/article/38a0db6fa64341bb26e729ff020cdc17</link>
      <guid>http://securityratty.com/article/38a0db6fa64341bb26e729ff020cdc17</guid>
      <description><![CDATA[An major electronic voting system vendor has changed its story in an attempt to explain how its machines dropped hundreds of votes in Ohio's March primary elections, saying it was a programming error,...]]></description>
      <content:encoded><![CDATA[An major electronic voting system vendor has changed its story in an attempt to explain how its machines dropped hundreds of votes in Ohio's March primary elections, saying it was a programming error, not the fault of antivirus software.]]></content:encoded>
      <pubDate>Thu, 21 Aug 2008 20:00:00 +0000</pubDate>
      <category domain="http://securityratty.com/tag/march primary elections">march primary elections</category>
      <category domain="http://securityratty.com/tag/system vendor">system vendor</category>
      <category domain="http://securityratty.com/tag/antivirus software">antivirus software</category>
      <category domain="http://securityratty.com/tag/major electronic">major electronic</category>
      <category domain="http://securityratty.com/tag/votes">votes</category>
      <category domain="http://securityratty.com/tag/story">story</category>
      <category domain="http://securityratty.com/tag/ohio">ohio</category>
      <category domain="http://securityratty.com/tag/attempt">attempt</category>
      <category domain="http://securityratty.com/tag/machines">machines</category>
      <source url="http://www.networkworld.com/news/2008/082208-e-voting-vendor-programming-errors-caused.html?fsrc=rss-security">E-voting vendor: Programming errors caused dropped votes</source>
    </item>
    <item>
      <title><![CDATA[MadMACs Ver. 1.2: Update to my MAC address and host name changer / randomizer / spoofer ]]></title>
      <link>http://securityratty.com/article/1e47dc41a51dfdc48802f357ad2656b6</link>
      <guid>http://securityratty.com/article/1e47dc41a51dfdc48802f357ad2656b6</guid>
      <description><![CDATA[Qwasty let me know that if host name randomization is used with MacMACs, and the host name is over 15 characters (or has certain bad illegal characters) it can cause all sorts of lsass.exe errors on...]]></description>
      <content:encoded><![CDATA[Qwasty let me know that if host name randomization is used with MacMACs, and the host name is over 15 characters (or has certain bad illegal characters) it can cause all sorts of lsass.exe errors on boot up. To fix this, I've updated the code to do some sanity checks on the possible hostnames given to it in dic.txt. Hopefully this fixes the problem. I also compiled it with the newer Autoit3 v3.2.12.1.
<p><a href="http://feeds.feedburner.com/~a/IrongeeksSecuritySite?a=LwV14k"><img src="http://feeds.feedburner.com/~a/IrongeeksSecuritySite?i=LwV14k" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/IrongeeksSecuritySite/~4/358048581" height="1" width="1"/>]]></content:encoded>
      <pubDate>Wed, 06 Aug 2008 20:13:25 +0000</pubDate>
      <category domain="http://securityratty.com/tag/characters">characters</category>
      <category domain="http://securityratty.com/tag/bad illegal characters">bad illegal characters</category>
      <category domain="http://securityratty.com/tag/host">host</category>
      <category domain="http://securityratty.com/tag/exe errors">exe errors</category>
      <category domain="http://securityratty.com/tag/sanity checks">sanity checks</category>
      <category domain="http://securityratty.com/tag/txt">txt</category>
      <category domain="http://securityratty.com/tag/hostnames">hostnames</category>
      <category domain="http://securityratty.com/tag/randomization">randomization</category>
      <category domain="http://securityratty.com/tag/macmacs">macmacs</category>
      <source url="http://feeds.feedburner.com/~r/IrongeeksSecuritySite/~3/358048581/i.php">MadMACs Ver. 1.2: Update to my MAC address and host name changer / randomizer / spoofer </source>
    </item>
    <item>
      <title><![CDATA[Better exception reporting in ASP.NET part 2]]></title>
      <link>http://securityratty.com/article/b878f7921917b371086606df6d043229</link>
      <guid>http://securityratty.com/article/b878f7921917b371086606df6d043229</guid>
      <description><![CDATA[This is the third post in a series
The first post described the problem: ASP.NET wasn't reporting inner exception stack traces
The second post described my solution
This post shows the code I used to...]]></description>
      <content:encoded><![CDATA[<p>This is the third post in a series.</p> <p>The <a href="http://www.pluralsight.com/community/blogs/keith/archive/2008/08/01/asp-net-health-monitoring-doesn-t-log-inner-exception-stack-trace.aspx" target="_blank">first post</a> described the problem: ASP.NET wasn&#39;t reporting inner exception stack traces.</p> <p>The <a href="http://www.pluralsight.com/community/blogs/keith/archive/2008/08/01/better-exception-reporting-in-asp-net.aspx" target="_blank">second post</a> described my solution.</p> <p>This post shows the code I used to solve the problem: a custom email provider for the Health Monitoring system in ASP.NET. Enjoy!</p> <p>Here&#39;s the provider. Note that I opted *not* to build a buffering provider to keep things simple:</p><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> MyMailWebEventProvider : WebEventProvider
{
    <span class="kwrd">string</span> to;
    <span class="kwrd">string</span> from;
    <span class="kwrd">string</span> subjectPrefix;

    <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Initialize(<span class="kwrd">string</span> name,
        NameValueCollection config)
    {
        <span class="kwrd">base</span>.Initialize(name, config);

        to = GetAndRemoveStringAttribute(config, <span class="str">&quot;to&quot;</span>, <span class="kwrd">true</span>);
        from = GetAndRemoveStringAttribute(config, <span class="str">&quot;from&quot;</span>, <span class="kwrd">true</span>);
        subjectPrefix = GetAndRemoveStringAttribute(config,
            <span class="str">&quot;subjectPrefix&quot;</span>, <span class="kwrd">false</span>);
    }
    <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> ProcessEvent(WebBaseEvent raisedEvent)
    {
        SendMail(raisedEvent);
    }

    <span class="kwrd">private</span> <span class="kwrd">void</span> SendMail(WebBaseEvent raisedEvent)
    {
        <span class="kwrd">string</span> subject = ComputeEmailSubject(raisedEvent);
        <span class="kwrd">string</span> body = ComputeEmailBody(raisedEvent);

        MailMessage msg = <span class="kwrd">new</span> MailMessage(from, to, subject, body);
        <span class="kwrd">new</span> SmtpClient().Send(msg);
    }

    <span class="kwrd">private</span> <span class="kwrd">string</span> ComputeEmailBody(WebBaseEvent raisedEvent)
    {
        WebRequestErrorEvent errorEvent =
            raisedEvent <span class="kwrd">as</span> WebRequestErrorEvent;
        <span class="kwrd">if</span> (<span class="kwrd">null</span> != errorEvent)
            <span class="kwrd">return</span> ErrorEventFormattingHelper.FormatRequestErrorEvent(errorEvent);
        <span class="kwrd">else</span> <span class="kwrd">return</span> raisedEvent.ToString();
    }

    <span class="kwrd">private</span> <span class="kwrd">string</span> ComputeEmailSubject(WebBaseEvent raisedEvent)
    {
        StringBuilder subjectBuilder = <span class="kwrd">new</span> StringBuilder();

        <span class="rem">// surface some details in subject about error events</span>
        WebBaseErrorEvent errorEvent = raisedEvent <span class="kwrd">as</span> WebBaseErrorEvent;
        <span class="kwrd">if</span> (<span class="kwrd">null</span> != errorEvent)
        {
            Exception unhandledException = errorEvent.ErrorException;

            <span class="rem">// drill through reflection exceptions to show the root cause</span>
            TargetInvocationException invocationException =
                unhandledException <span class="kwrd">as</span> TargetInvocationException;
            <span class="kwrd">if</span> (<span class="kwrd">null</span> != invocationException)
            {
                Exception innerException =
                    DrillIntoTargetInvocationException(invocationException);
                subjectBuilder.AppendFormat(<span class="str">&quot;{0}&quot;</span>,
                    (innerException ?? invocationException).GetType().Name);
                <span class="kwrd">if</span> (<span class="kwrd">null</span> != innerException)
                    subjectBuilder.Append(<span class="str">&quot; (via reflection)&quot;</span>);
            }
            <span class="kwrd">else</span> subjectBuilder.Append(unhandledException.GetType().Name);
        }

        <span class="rem">// if we&#39;ve not got anything better</span>
        <span class="rem">// just show the event type in the subject</span>
        <span class="kwrd">if</span> (0 == subjectBuilder.Length)
            subjectBuilder.AppendFormat(<span class="str">&quot;Event type: {0}&quot;</span>,
                raisedEvent.GetType().Name);

        <span class="kwrd">if</span> (!<span class="kwrd">string</span>.IsNullOrEmpty(subjectPrefix)) {
            subjectBuilder.Insert(0, <span class="str">&#39; &#39;</span>);
            subjectBuilder.Insert(0, subjectPrefix);
        }
        <span class="kwrd">return</span> subjectBuilder.ToString();
    }

    <span class="rem">/// &lt;summary&gt;</span>
    <span class="rem">/// Reflection often hides exception details, so we try to drill down</span>
    <span class="rem">/// through the plumbing exceptions to find a likely cause</span>
    <span class="rem">/// &lt;/summary&gt;</span>
    <span class="kwrd">private</span> Exception DrillIntoTargetInvocationException(
        TargetInvocationException outerException)
    {
        Exception innerException = outerException.InnerException;
        TargetInvocationException innerInvocationException =
            innerException <span class="kwrd">as</span> TargetInvocationException;
        <span class="kwrd">if</span> (<span class="kwrd">null</span> != innerInvocationException)
            <span class="kwrd">return</span> DrillIntoTargetInvocationException(innerInvocationException);
        <span class="kwrd">else</span> <span class="kwrd">if</span> (<span class="kwrd">null</span> != innerException)
            <span class="kwrd">return</span> innerException;
        <span class="kwrd">else</span> <span class="kwrd">return</span> <span class="kwrd">null</span>;
    }

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">string</span> GetAndRemoveStringAttribute(NameValueCollection config,
        <span class="kwrd">string</span> attributeName, <span class="kwrd">bool</span> required)
    {
        <span class="kwrd">string</span> <span class="kwrd">value</span> = config.Get(attributeName);
        <span class="kwrd">if</span> (required &amp;&amp; <span class="kwrd">string</span>.IsNullOrEmpty(<span class="kwrd">value</span>))
            <span class="kwrd">throw</span> <span class="kwrd">new</span> ConfigurationErrorsException(<span class="kwrd">string</span>.Format(
                <span class="str">&quot;Expected attribute {0}, which is missing or empty.&quot;</span>,
                attributeName));
        config.Remove(attributeName);
        <span class="kwrd">return</span> <span class="kwrd">value</span>;
    }

    <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Flush()
    {
        <span class="rem">// nothing to do - this is not a buffering provider</span>
    }

    <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Shutdown()
    {
        <span class="rem">// nothing to do here either</span>
    }
}</pre>
<p>Here&#39;s a helper class that formats the error messages the way I want to see them. Note that I&#39;ve omitted some fields that I personally didn&#39;t care about, and I&#39;ve reordered things a bit, so you might want to tweak this if you&#39;re going to use it in your own system.</p><pre class="csharpcode"><span class="kwrd">internal</span> <span class="kwrd">static</span> <span class="kwrd">class</span> ErrorEventFormattingHelper
{
    <span class="kwrd">internal</span> <span class="kwrd">static</span> <span class="kwrd">string</span> FormatRequestErrorEvent(
        WebRequestErrorEvent errorEvent)
    {
        CustomEventFormatter formatter = 
            <span class="kwrd">new</span> CustomEventFormatter();

        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Unhandled Exception in {0}:&quot;</span>,
            WebBaseEvent.ApplicationInformation
            .ApplicationVirtualPath));
        formatter.Indent();
        EmitExceptionAtAGlance(formatter, 
            errorEvent.ErrorException);
        formatter.RevertIndent();

        formatter.AppendLine();
        formatter.AppendLine(<span class="str">&quot;Exception stack trace(s):&quot;</span>);
        EmitExceptionStackTrace(formatter, 
            errorEvent.ErrorException);

        formatter.AppendLine();
        formatter.AppendLine(<span class="str">&quot;Event information:&quot;</span>);
        formatter.Indent();
        EmitEventInfo(formatter, errorEvent);
        formatter.RevertIndent();

        formatter.AppendLine();
        formatter.AppendLine(<span class="str">&quot;Application information:&quot;</span>);
        formatter.Indent();
        EmitApplicationInfo(formatter, 
            WebBaseEvent.ApplicationInformation);
        formatter.RevertIndent();

        formatter.AppendLine();
        formatter.AppendLine(<span class="str">&quot;Process/thread information:&quot;</span>);
        formatter.Indent();
        EmitProcessInfo(formatter, 
            errorEvent.ProcessInformation);
        formatter.RevertIndent();

        formatter.AppendLine();
        formatter.AppendLine(<span class="str">&quot;Request information:&quot;</span>);
        formatter.Indent();
        EmitRequestInfo(formatter, 
            errorEvent.RequestInformation);
        formatter.RevertIndent();

        <span class="kwrd">return</span> formatter.ToString();
    }

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> EmitEventInfo(
        CustomEventFormatter formatter,
        WebBaseEvent theEvent)
    {
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Event code: {0}&quot;</span>,
            theEvent.EventCode.ToString(
            CultureInfo.InvariantCulture)));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Event message: {0}&quot;</span>, 
            theEvent.Message));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Event time: {0}&quot;</span>, 
            theEvent.EventTime.ToString(
            CultureInfo.InvariantCulture)));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Event ID: {0}&quot;</span>, 
            theEvent.EventID.ToString(<span class="str">&quot;N&quot;</span>, 
            CultureInfo.InvariantCulture)));
    }

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> EmitApplicationInfo(
        CustomEventFormatter formatter, 
        WebApplicationInformation appInfo)
    {
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Application domain: {0}&quot;</span>, 
            appInfo.ApplicationDomain));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Application Virtual Path: {0}&quot;</span>, 
            appInfo.ApplicationVirtualPath));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Application Physical Path: {0}&quot;</span>, 
            appInfo.ApplicationPath));
    }

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> EmitProcessInfo(
        CustomEventFormatter formatter, 
        WebProcessInformation webProcessInfo)
    {
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Process ID: {0}&quot;</span>, 
            webProcessInfo.ProcessID.ToString(
            CultureInfo.InvariantCulture)));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Process name: {0}&quot;</span>, 
            webProcessInfo.ProcessName));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Account name: {0}&quot;</span>, 
            webProcessInfo.AccountName));
    }

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> EmitRequestInfo(
        CustomEventFormatter formatter, 
        WebRequestInformation webRequestInfo)
    {
        <span class="kwrd">string</span> name = <span class="kwrd">null</span>;
        <span class="kwrd">if</span> (webRequestInfo.Principal != <span class="kwrd">null</span>)
            name = webRequestInfo.Principal.Identity.Name;

        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Request URL: {0}&quot;</span>, 
            webRequestInfo.RequestUrl));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Request path: {0}&quot;</span>, 
            webRequestInfo.RequestPath));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;User name: {0}&quot;</span>, 
            name ?? <span class="str">&quot;[ANONYMOUS]&quot;</span>));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;User host address: {0}&quot;</span>, 
            webRequestInfo.UserHostAddress));
    }

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> EmitExceptionAtAGlance(
        CustomEventFormatter formatter, 
        Exception exception)
    {
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Type: {0}&quot;</span>, 
            exception.GetType().Name));
        formatter.AppendLine(<span class="kwrd">string</span>.Format(
            <span class="str">&quot;Message: {0}&quot;</span>, 
            exception.Message));
        <span class="kwrd">if</span> (<span class="kwrd">null</span> != exception.InnerException)
        {
            formatter.Indent();
            formatter.AppendLine(<span class="str">&quot;--&gt;Inner Exception&quot;</span>);
            EmitExceptionAtAGlance(formatter, 
                exception.InnerException);
            formatter.RevertIndent();
        }
    }

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> EmitExceptionStackTrace(
        CustomEventFormatter formatter, Exception exception)
    {
        formatter.AppendLine(exception.StackTrace);

        <span class="kwrd">if</span> (<span class="kwrd">null</span> != exception.InnerException)
        {
            <span class="rem">// no point indenting</span>
            <span class="rem">// since stack traces typically wrap like crazy</span>
            formatter.AppendLine();
            formatter.AppendLine(<span class="str">&quot;--&gt;Inner exception stack trace:&quot;</span>);
            EmitExceptionStackTrace(formatter, exception.InnerException);
        }
    }
}
</pre>
<p>And finally, here&#39;s a helper class that manages indentation levels for the output email message:</p><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> CustomEventFormatter
{
    <span class="kwrd">const</span> <span class="kwrd">int</span> TabSpaces = 4;

    StringBuilder sb = <span class="kwrd">new</span> StringBuilder();
    <span class="kwrd">private</span> <span class="kwrd">int</span> indentLevel;
    <span class="kwrd">private</span> <span class="kwrd">bool</span> startingNewLine = <span class="kwrd">true</span>;

    <span class="kwrd">public</span> <span class="kwrd">void</span> Indent()
    {
        ++indentLevel;
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> RevertIndent()
    {
        <span class="kwrd">if</span> (indentLevel &gt; 0)
            --indentLevel;
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> Append(<span class="kwrd">string</span> text)
    {
        <span class="kwrd">if</span> (startingNewLine)
            EmitIndent();
        sb.Append(text);
        startingNewLine = <span class="kwrd">false</span>;
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> AppendLine(<span class="kwrd">string</span> lineOfText)
    {
        <span class="kwrd">if</span> (startingNewLine)
            EmitIndent();
        EmitIndent();
        sb.AppendLine(lineOfText);
        startingNewLine = <span class="kwrd">true</span>;
    }

    <span class="kwrd">private</span> <span class="kwrd">void</span> EmitIndent()
    {
        sb.Append(<span class="str">&#39; &#39;</span>, TabSpaces * indentLevel);
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> AppendLine()
    {
        AppendLine(<span class="kwrd">string</span>.Empty);
    }

    <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">string</span> ToString()
    {
        <span class="kwrd">return</span> sb.ToString();
    }
}
</pre>
<p>Build this into a library application and reference it in your config file. Here&#39;s an example:</p><pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">healthMonitoring</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">providers</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">name</span><span class="kwrd">=&quot;mailWebEventProvider&quot;</span>
         <span class="attr">type</span><span class="kwrd">=&quot;MyMailWebEventProvider&quot;</span>
         <span class="attr">to</span><span class="kwrd">=&quot;web-fault@fabrikam.com&quot;</span>
         <span class="attr">from</span><span class="kwrd">=&quot;website@fabrikam.com&quot;</span>
         <span class="attr">buffer</span><span class="kwrd">=&quot;false&quot;</span>
         <span class="attr">subjectPrefix</span><span class="kwrd">=&quot;[WEB-ERROR]&quot;</span>
       <span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">providers</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">rules</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">name</span><span class="kwrd">=&quot;All Errors Email&quot;</span>
         <span class="attr">eventName</span><span class="kwrd">=&quot;All Errors&quot;</span>
         <span class="attr">provider</span><span class="kwrd">=&quot;mailWebEventProvider&quot;</span>
         <span class="attr">profile</span><span class="kwrd">=&quot;Default&quot;</span>
         <span class="attr">minInstances</span><span class="kwrd">=&quot;1&quot;</span>
         <span class="attr">maxLimit</span><span class="kwrd">=&quot;Infinite&quot;</span>
         <span class="attr">minInterval</span><span class="kwrd">=&quot;00:01:00&quot;</span>
         <span class="attr">custom</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">rules</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">healthMonitoring</span><span class="kwrd">&gt;</span>
</pre><div style="clear:both;"></div><img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=52349" width="1" height="1">]]></content:encoded>
      <pubDate>Mon, 04 Aug 2008 10:11:14 +0000</pubDate>
      <category domain="http://securityratty.com/tag/return">return</category>
      <category domain="http://securityratty.com/tag/return subjectbuilder">return subjectbuilder</category>
      <category domain="http://securityratty.com/tag/return formatter">return formatter</category>
      <category domain="http://securityratty.com/tag/exception">exception</category>
      <category domain="http://securityratty.com/tag/formatter">formatter</category>
      <category domain="http://securityratty.com/tag/crazy formatter">crazy formatter</category>
      <category domain="http://securityratty.com/tag/static void">static void</category>
      <category domain="http://securityratty.com/tag/static void emitprocessinfo">static void emitprocessinfo</category>
      <category domain="http://securityratty.com/tag/return null">return null</category>
      <source url="http://www.pluralsight.com/community/blogs/keith/archive/2008/08/04/better-exception-reporting-in-asp-net-part-2.aspx">Better exception reporting in ASP.NET part 2</source>
    </item>
    <item>
      <title><![CDATA[SANS Webcast: Security for Web Services and SOA ]]></title>
      <link>http://securityratty.com/article/7d633c7f6436def5b58166479fa3a99c</link>
      <guid>http://securityratty.com/article/7d633c7f6436def5b58166479fa3a99c</guid>
      <description><![CDATA[Last week I did a SANS webcast with Jacob West from Fortify on Web Services and SOA Security issues. I also did another SANS Webcast on Web services security way back in 2005. I went back and looked...]]></description>
      <content:encoded><![CDATA[<p>Last week I did a <a href="https://www.sans.org/webcasts/show.php?webcastid=91958">SANS webcast</a> with Jacob West from Fortify on Web Services and SOA Security issues. I also did another SANS Webcast on Web services security way back in 2005. I went back and looked at the 2005 slides and its really scary how the issues are still there. Again we see developers making hellacious progress and security treading water (in a moving stream). From 2005:</p><div><blockquote>
	<div>Many (most?) classic Information Security mechanisms are not as relevant in securing Web Services:</div><br><div><ul>
	<li>Firewalls:SSL</li>
	<li><span>SSL </span> </li>
	<li>Session based access control</li>
	<li>Policies &amp; mechanism domains are blurred by integration and decoupling</li>
	<li>Lack of end to end visibility </li>
	</ul>
	</div>
</blockquote></div><p>

I realize that security is a system level issue and it takes a long time to change things at that level, but what's more concerning to me is that the typical infosec mindset remains the same. Should we be surprised by rampant phishing and fraud? I am frankly surprised the numbers are so low given the opportunities that the attackers have via the glacial pace of security improvements. Its been three years since that list and I could write the same exact one today for SOAP, REST, SOA, Web 2.0 whatever.

Maybe the main reason, beyond failure of imagination, why infosec is so far behind developers is that infosec lacks tools. Developers automate everything possible. Security doesn't. The most promising thing about static analysis is not the ability to find everything, its the ability to find many important things in an automated way. Infosec needs to stop giving people fish and teaching people to fish.

Look at Fortify's vulncat site which has a <a href="http://www.fortify.com/vulncat/en/vulncat/index.html">Taxonomy of Coding Errors</a>. Fortify's Seven (plus one) pernicious kingdoms are:</p><div><ul>
<li>Input Validation and Representation
</li>
<li>API Abuse
</li>
<li>Security Features
</li>
<li>Time and State
</li>
<li>Errors
</li>
<li>Code Quality
</li>
<li>Encapsulation
</li>
<li>*. Environment

</li>
</ul>

These vulns are then integrated to find security bugs in a variety of frameworks - Axis, Axis2, Websphere and .Net. The tools give security people a richer understanding about the actual state of security in their web services, the ability to communicate and debate design improvement tradeoffs with developers, and cogent advice on how to address the issues. </div><br><div>It would be fantastic if the list of security issues in 2011 is different from the one 2005 that we are still stuck with.</div>]]></content:encoded>
      <pubDate>Mon, 04 Aug 2008 07:29:54 +0000</pubDate>
      <category domain="http://securityratty.com/tag/web services">web services</category>
      <category domain="http://securityratty.com/tag/web">web</category>
      <category domain="http://securityratty.com/tag/security issues">security issues</category>
      <category domain="http://securityratty.com/tag/issues">issues</category>
      <category domain="http://securityratty.com/tag/security">security</category>
      <category domain="http://securityratty.com/tag/web services security">web services security</category>
      <category domain="http://securityratty.com/tag/soa security issues">soa security issues</category>
      <category domain="http://securityratty.com/tag/soa">soa</category>
      <category domain="http://securityratty.com/tag/security improvements">security improvements</category>
      <source url="http://1raindrop.typepad.com/1_raindrop/2008/08/sans-webcast-security-for-web-services-and-soa.html">SANS Webcast: Security for Web Services and SOA </source>
    </item>
    <item>
      <title><![CDATA[Better exception reporting in ASP.NET]]></title>
      <link>http://securityratty.com/article/34119f443c0ec116d6e16efd70378528</link>
      <guid>http://securityratty.com/article/34119f443c0ec116d6e16efd70378528</guid>
      <description><![CDATA[In my last post , I commented on how ASP.NET health monitoring doesn't output stack traces for inner exceptions, which can be problematic due to its heavy reliance on reflection. I spent the morning...]]></description>
      <content:encoded><![CDATA[<p>In <a href="http://www.pluralsight.com/community/blogs/keith/archive/2008/08/01/asp-net-health-monitoring-doesn-t-log-inner-exception-stack-trace.aspx" target="_blank">my last post</a>, I commented on how ASP.NET health monitoring doesn&#39;t output stack traces for inner exceptions, which can be problematic due to its heavy reliance on reflection. I spent the morning doing some further spelunking with <a href="http://www.aisto.com/roeder/dotnet/" target="_blank">reflector</a>, and my first solution was to implement a custom WebEvent that overrides ToString() to format itself with all of the data I care about. I then overrode the Error event via global.asax and raised my custom event, instead of letting ASP.NET raise its default event. This worked reasonably well with the SimpleMailWebEventProvider, but didn&#39;t seem to change anything at all with the event log provider.</p> <p>What I found is that the two providers were using entirely different means to format the events! The email provider calls ToString(bool, bool) on the event to ask it to format itself. But the EventLogWebEventProvider does its own formatting of individual fields of the event. Indeed, its ProcessEvent method has a big list of checks:</p><pre class="csharpcode"><span class="kwrd">if</span> (eventRaised <span class="kwrd">is</span> WebBaseErrorEvent)
    AddErrorStuff();
<span class="kwrd">if</span> (eventRaised <span class="kwrd">is</span> WebAuthenticationSuccessAuditEvent)
    AddLogonStuff();
</pre>
<p>So it seemed like a better approach would be to write my own provider. I left the event log provider alone, and I wrote a custom email provider to display errors in a more useful way. This also allowed me to drop some fields from the event report that aren&#39;t useful for us. And I was able to construct a much more concise and useful subject line (the subject line that SimpleMailWebEventProvider uses is rather clunky since it assumes it might be spitting out a whole bunch of buffered events in one go).</p>
<p>Not only does my provider include the stack traces for all of the exceptions in the chain, but in the subject line, I display the type of error that is at the root of the problem. So if I am formatting a TargetInvocationException, I drill into its InnerException chain until I find a different exception type, and display that exception type instead.</p>
<p>Oh, one other benefit of building the custom provider instead of using a custom WebEvent was that I was then able to remove the Error handler from global.asax. All I had to do was replace the SimpleMailWebEventProvider with my own provider, and I got the behavior I wanted. Now my email notifications include detailed stack traces.</p>
<p>I&#39;ll post the code for this provider once it&#39;s run for a little while in production and I&#39;m satisfied that it works reasonably well.</p><div style="clear:both;"></div><img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=52314" width="1" height="1">]]></content:encoded>
      <pubDate>Fri, 01 Aug 2008 16:30:05 +0000</pubDate>
      <category domain="http://securityratty.com/tag/error event">error event</category>
      <category domain="http://securityratty.com/tag/event">event</category>
      <category domain="http://securityratty.com/tag/provider">provider</category>
      <category domain="http://securityratty.com/tag/default event">default event</category>
      <category domain="http://securityratty.com/tag/email provider calls">email provider calls</category>
      <category domain="http://securityratty.com/tag/event log provider">event log provider</category>
      <category domain="http://securityratty.com/tag/provider include">provider include</category>
      <category domain="http://securityratty.com/tag/custom email provider">custom email provider</category>
      <category domain="http://securityratty.com/tag/output stack traces">output stack traces</category>
      <source url="http://www.pluralsight.com/community/blogs/keith/archive/2008/08/01/better-exception-reporting-in-asp-net.aspx">Better exception reporting in ASP.NET</source>
    </item>
    <item>
      <title><![CDATA[Apple Finally Patches DNS Bug]]></title>
      <link>http://securityratty.com/article/97bfbbeabb93754b8d92bca89e191539</link>
      <guid>http://securityratty.com/article/97bfbbeabb93754b8d92bca89e191539</guid>
      <description><![CDATA[After taking guff in the press for a while for their lack of a patch for the famous recent DNS bug, Apple has finally issued a patch. The update it comes in also patches 16 other vulnerabilities
Open...]]></description>
      <content:encoded><![CDATA[<a href="http://db.tidbits.com/article/9706">After taking guff in the press for a while</a> for their lack of a patch for the famous recent DNS bug, Apple has finally issued a patch. <a href="http://support.apple.com/kb/HT2647">The update it comes in also patches 16 other vulnerabilities.</a>

<ul>
	<li>Open Scripting Architecture&#151;Privilege elevation bug when loading plugins.</li>
	<li>CarbonCore&#151;A stack overflow in handling long file names. Potential code execution.</li>
	<li>CoreGraphics&#151;2 bugs, both code execution, one for malicious graphics the other for malicious PDFs.</li>
	<li>Data Detectors Engine&#151;Engine may crash when parsing maliciously crafted content.</li>
	<li>Disk Utility&#151;A local user may obtain System privileges.</li>
	<li>OpenLDAP&#151;An ASN parsing bug can lead to a crash.</li>
	<li>OpenSSL&#151;A range checking error from last September (Red Hat patched it in 2 weeks) can lead to remote code execution.</li>
	<li>PHP&#151;5 different bugs, the worst of which can lead to remote code execution. </li>
	<li>QuickLook&#151;A maliciously-crafted Microsoft Office file can cause QuickLooks to crash or allow remote code execution.</li>
	<li>rsync&#151;Path validation errors, which were also reported in 2007, are resolved.</li>
</ul><br style="clear: both;"/>
  <img alt="" style="border: 0; height:1px; width:1px;" border="0" src="http://www.pheedo.com/img.phdo?i=abf12a39094359c814fd385242a4a01a" height="1" width="1"/>
<img src="http://www.pheedo.com/feeds/tracker.php?i=abf12a39094359c814fd385242a4a01a" style="display: none;" border="0" height="1" width="1" alt=""/><img src="http://feeds.ziffdavisenterprise.com/~r/RSS/cheap_hack/~4/352198240" height="1" width="1"/>]]></content:encoded>
      <pubDate>Thu, 31 Jul 2008 19:12:34 +0000</pubDate>
      <category domain="http://securityratty.com/tag/code execution">code execution</category>
      <category domain="http://securityratty.com/tag/remote code execution">remote code execution</category>
      <category domain="http://securityratty.com/tag/bug">bug</category>
      <category domain="http://securityratty.com/tag/potential code execution">potential code execution</category>
      <category domain="http://securityratty.com/tag/lead">lead</category>
      <category domain="http://securityratty.com/tag/data detectors engineengine">data detectors engineengine</category>
      <category domain="http://securityratty.com/tag/bugs">bugs</category>
      <category domain="http://securityratty.com/tag/microsoft office file">microsoft office file</category>
      <category domain="http://securityratty.com/tag/elevation bug">elevation bug</category>
      <source url="http://feeds.ziffdavisenterprise.com/~r/RSS/cheap_hack/~3/352198240/apple_finally_patches_dns_bug.html">Apple Finally Patches DNS Bug</source>
    </item>
    <item>
      <title><![CDATA[Apple Finally Patches DNS Bug]]></title>
      <link>http://securityratty.com/article/dd4b7bad7cc598605249c8e7e27d4031</link>
      <guid>http://securityratty.com/article/dd4b7bad7cc598605249c8e7e27d4031</guid>
      <description><![CDATA[After taking guff in the press for a while for its lack of a patch for the famous recent DNS bug, Apple has finally issued a patch. The update it comes in also patches 16 other vulnerabilities
Open...]]></description>
      <content:encoded><![CDATA[<a href="http://db.tidbits.com/article/9706">After taking guff in the press for a while</a> for its lack of a patch for the famous recent DNS bug, Apple has finally issued a patch. <a href="http://support.apple.com/kb/HT2647">The update it comes in also patches 16 other vulnerabilities:</a>

<ul>
	<li>Open Scripting Architecture&#151;Privilege elevation bug when loading plug-ins.</li>
	<li>CarbonCore&#151;A stack overflow in handling long file names. Potential code execution.</li>
	<li>CoreGraphics&#151;Two bugs, both code execution, one for malicious graphics, the other for malicious PDFs.</li>
	<li>Data Detectors Engine&#151;Engine may crash when parsing maliciously crafted content.</li>
	<li>Disk Utility&#151;A local user may obtain System privileges.</li>
	<li>OpenLDAP&#151;An ASN parsing bug can lead to a crash.</li>
	<li>OpenSSL&#151;A range checking error from last September (Red Hat patched it in two weeks) can lead to remote code execution.</li>
	<li>PHP&#151;Five different bugs, the worst of which can lead to remote code execution. </li>
	<li>QuickLook&#151;A maliciously crafted Microsoft Office file can cause QuickLooks to crash or allow remote code execution.</li>
	<li>rsync&#151;Path validation errors, which were also reported in 2007, are resolved.</li>
</ul><img src="http://feedproxy.google.com/~r/RSS/cheap_hack/~4/gi6Qi_HP0Y8" height="1" width="1"/>]]></content:encoded>
      <pubDate>Thu, 31 Jul 2008 19:12:34 +0000</pubDate>
      <category domain="http://securityratty.com/tag/code execution">code execution</category>
      <category domain="http://securityratty.com/tag/remote code execution">remote code execution</category>
      <category domain="http://securityratty.com/tag/bug">bug</category>
      <category domain="http://securityratty.com/tag/potential code execution">potential code execution</category>
      <category domain="http://securityratty.com/tag/quicklooka maliciously">quicklooka maliciously</category>
      <category domain="http://securityratty.com/tag/lead">lead</category>
      <category domain="http://securityratty.com/tag/data detectors engineengine">data detectors engineengine</category>
      <category domain="http://securityratty.com/tag/coregraphicstwo bugs">coregraphicstwo bugs</category>
      <category domain="http://securityratty.com/tag/bugs">bugs</category>
      <source url="http://feeds.ziffdavisenterprise.com/~r/RSS/cheap_hack/~3/gi6Qi_HP0Y8/apple_finally_patches_dns_bug.html">Apple Finally Patches DNS Bug</source>
    </item>
    <item>
      <title><![CDATA[At SANSFIRE 2008 in Washington, DC]]></title>
      <link>http://securityratty.com/article/69b7a54c07f2833e13efa53aef2a59c8</link>
      <guid>http://securityratty.com/article/69b7a54c07f2833e13efa53aef2a59c8</guid>
      <description><![CDATA[I just landed at Washington, DC to speak at SANSFIRE tomorrow ( my Lunch and Learn on &quot;Log Management 'Worst Practices'&quot; is on Wednesday, July 23rd - come over, it will be fun
LogLogic Lunch and Learn...]]></description>
      <content:encoded><![CDATA[<p>I just landed at Washington, DC to speak at SANSFIRE tomorrow (<a href="http://www.sans.org/sansfire08/vendor.php">my Lunch and Learn on &quot;Log Management 'Worst Practices'&quot;</a> is on Wednesday, July 23rd - come over, it will be fun!)</p>  <p><em><strong>LogLogic Lunch and Learn Presentation</strong>      <br />- &quot;Worst Practices&quot; of Log Management      <br />- Speaker: Dr. Anton Chuvakin, GCIA, GCIH, GCFA      <br />- Wednesday, July 23rd, 2008 * 12:30pm - 1:15 pm</em></p>  <p><em>Want to learn all the embarrassing mistakes and pitfalls that await you on the path to log management nirvana? Attend &quot;'Worst Practices' of Log Management&quot; presentation by LogLogic's Logging Evangelist Dr Anton Chuvakin that covers all the things that can go wrong while planning, evaluating, deploying and running a log management solution. Insufficient planning, unrealistic expectations, choosing tools on price alone, lack of logging configuration guidance are among such &quot;worst practices.&quot; Each common &quot;worst practice&quot; will be accompanied by suggestions to avoid the errors and do things correctly! Everybody touts &quot;best practices&quot;, but this is the place to learn how to avoid the opposite - and have fun in the process.</em></p>  <p>if you want to meet, drop me an email/call or just show up for &quot;lunch and learn.&quot; Unfortunately, I am going back right after my presentation tomorrow...</p>  <div class="blogger-post-footer">About me: http://www.chuvakin.org</div><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/AntonChuvakinPersonalBlog?a=Ets4bJ"><img src="http://feeds.feedburner.com/~f/AntonChuvakinPersonalBlog?i=Ets4bJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AntonChuvakinPersonalBlog?a=WzVtJJ"><img src="http://feeds.feedburner.com/~f/AntonChuvakinPersonalBlog?i=WzVtJJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/AntonChuvakinPersonalBlog?a=xVtnNJ"><img src="http://feeds.feedburner.com/~f/AntonChuvakinPersonalBlog?i=xVtnNJ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonChuvakinPersonalBlog/~4/343116514" height="1" width="1"/>]]></content:encoded>
      <pubDate>Tue, 22 Jul 2008 15:01:00 +0000</pubDate>
      <category domain="http://securityratty.com/tag/log management">log management</category>
      <category domain="http://securityratty.com/tag/log management nirvana">log management nirvana</category>
      <category domain="http://securityratty.com/tag/log management solution">log management solution</category>
      <category domain="http://securityratty.com/tag/worst practices">worst practices</category>
      <category domain="http://securityratty.com/tag/practices">practices</category>
      <category domain="http://securityratty.com/tag/anton chuvakin">anton chuvakin</category>
      <category domain="http://securityratty.com/tag/chuvakin">chuvakin</category>
      <category domain="http://securityratty.com/tag/lunch">lunch</category>
      <category domain="http://securityratty.com/tag/loglogic lunch">loglogic lunch</category>
      <source url="http://feeds.feedburner.com/~r/AntonChuvakinPersonalBlog/~3/343116514/at-sansfire-2008-in-washington-dc.html">At SANSFIRE 2008 in Washington, DC</source>
    </item>
    <item>
      <title><![CDATA[Reference Clients, the Global Meltdown and CEP]]></title>
      <link>http://securityratty.com/article/5c50f1c1126cb365379b87a267642821</link>
      <guid>http://securityratty.com/article/5c50f1c1126cb365379b87a267642821</guid>
      <description><![CDATA[Sometimes I get email from colleagues who ask me why I am working on compiling CEP/EP reference clients
My reply is that I dont care must about reported dollar sales because these numbers are, for the...]]></description>
      <content:encoded><![CDATA[<p>Sometimes I get email from colleagues who ask me why I am working on compiling CEP/EP reference clients.  </p>
<p>My reply is that I don&#8217;t care must about reported dollar sales because these numbers are, for the most part, meaningless and mythical at this point in time.  Large companies sell enterprise licenses and make up allocated numbers for the CEP/EP share of the pie based on a subjective formulation.   They can sell an enterprise site license for $2,000,000 USD that includes CEP/EP software and claim 20% is CEP revenue, regardless of if the software is used or not.</p>
<p>Small companies nearly give software away with the hope of developing a strong public reference client, which are few and far between in 2008.  Soon, I will start a Google spreadsheet, similar to what we did last year on this topic.  Some folks don&#8217;t seem to like this initiative because, unfortunately, we will see that for this half of 2008, this year has been very lean for CEP/EP.   Some would prefer I blog as a cheerleading evangelist versus an objective analyst.  Go Fight Win!  Rah Rah Rah!</p>
<p>Much of the current gloomy situation, of course, is because the entire market has fallen and IT spending is down.   Financial companies announce record losses.  Bankruptcies and restructuring are in the daily news.   </p>
<p>In this depressed market, some companies have tried to tie the subprime crash to CEP, somehow implying that CEP would have helped, but that positioning is mostly fantasy.  I work in the field of risk management at the corporate level and the current problems are not caused by a lack of technology, it is simply corporate greed - corporations taking high risks to stay competitive in a bull market and then they experience a frighteningly negative reversal during a market free fall.   </p>
<p>Of course, the US Federal Reserve did not help matters when they decided to poke a gaping hole in the real estate bubble by dramatically raising interest rates without thinking about how they would manage the consequences, but that is another story!    After all, the current top government executives in Washington DC are so politically, scientifically and economically incompetent that all we can do is hold our breath and count the days.</p>
<p>One risk management colleague often says,</p>
<blockquote><p> &#8220;When then tide is high, you can&#8217;t see that the swimmers are naked.&#8221;</p></blockquote>
<p>&#8230;.and so it is in business.  The current problems in the global market are based on human, social, and political errors and incompetence; nothing that technology can cure at this point in the game. So, the entire market is in decline, and folks are overhyping all software to keep the buzz going, as if CEP or SOA or BPM would have helped stopped the current global meltdown.    Yes, CEP can stop global warming!  Buy one today, save a cute polar bear!</p>
<p>Then again, maybe we only need a CEP engine in Washington; even a simple rules-based one would be good.  Naturally, some would suggest that we need Neural Nets and Bayesian analytics; but I think just a simple rules-engine looking out the window that can process if-then-else conditions would be a great improvement over the mind-numbing leadership in Washington today.</p>
]]></content:encoded>
      <pubDate>Fri, 18 Jul 2008 08:34:12 +0000</pubDate>
      <category domain="http://securityratty.com/tag/cep">cep</category>
      <category domain="http://securityratty.com/tag/market">market</category>
      <category domain="http://securityratty.com/tag/market free">market free</category>
      <category domain="http://securityratty.com/tag/cepep">cepep</category>
      <category domain="http://securityratty.com/tag/includes cepep software">includes cepep software</category>
      <category domain="http://securityratty.com/tag/global market">global market</category>
      <category domain="http://securityratty.com/tag/software">software</category>
      <category domain="http://securityratty.com/tag/cepep reference clients">cepep reference clients</category>
      <category domain="http://securityratty.com/tag/cep revenue">cep revenue</category>
      <source url="http://www.thecepblog.com/2008/07/18/reference-clients-the-global-meltdown-and-cep/">Reference Clients, the Global Meltdown and CEP</source>
    </item>
  </channel>
</rss>
