{
	"version": "https://jsonfeed.org/version/1",
	"title": "sean mcelroy: out of band",
	"icon": "https://avatars.micro.blog/avatars/2026/24/1924798.jpg",
	"home_page_url": "https://blog.seanmcelroy.com/",
	"feed_url": "https://blog.seanmcelroy.com/feed.json",
	"items": [
			{
				"id": "http://seanmcelroy.micro.blog/2019/01/30/thoughts-on-passing-the-giac.html",
				"title": "Thoughts on passing the GIAC Security Essentials (GSEC)",
				"content_html": "<p><a href=\"https://www.giac.org/certification/security-essentials-gsec\"><img class=\"alignright wp-image-496\" src=\"https://seanmcelroy.micro.blog/uploads/2026/865e2059d9.jpg\" alt=\"\" width=\"240\" height=\"240\"></a>Today I passed the GIAC Security Essentials Certification, also known as the GSEC.  I passed with a 95% on my first certification attempt, so I thought it might be useful to decompose my thoughts on this one for any who attempt it in the future.</p>\n<p>My background is technical - I started my career in software engineering and database performance tuning, moved into engineering leadership roles, and eventually ended up pursuing my interests in cybersecurity, where I have been a CISO at two financial services firms.  Yet, I&rsquo;m still very hands-on during the day, and I recently wrote a QUIC userspace implementation to learn the spec in the evenings.  I have previously earned the CISSP and CISM certifications, although these are more leadership and risk management focused credentials that don&rsquo;t speak much to technical aptitude as it relates to security.  For that reason, as well as my personal desire to keep my technical skills sharp while also working at the executive level and leading a team, I decided to apply to, and was accepted into, the SANS Technology Institute&rsquo;s (STI) Masters of Science in Information Security Engineering program.  The first stop along the MSISE journey is the GSEC.</p>\n<p>As part of the MSISE program, I pay tuition for a graduate class to gain access to SANS training and the associated GIAC exam which provides me with a grade for my course.  This was my very first SANS training and my first GIAC exam.  There was an option provided for me to directly challenge the exam since I do have and did recently earn my CISSP, but my STI student advisor kindly recommended I take in the full training experience.  I was admittedly reluctant both because I feel I am pretty strong technically and because it would have been slightly cheaper and faster for me to just go straight to the GSEC exam, but the advice was well founded.</p>\n<p>The SANS SEC 401 class by <a href=\"https://www.sans.org/instructors/dr-eric-cole\">Dr. Eric Cole</a> was outstanding.  Dr. Cole&rsquo;s presentation style feels genuine and engaging over the self-paced OnDemand modality I chose.  I walked into this content with the preconceived notion that much of this would be review for me, and honestly, a lot of it was for me.  This isn&rsquo;t to state the course is remedial, simply that as a builder of security programs, the concepts and advice aren&rsquo;t new to me, but some of the technical pieces were.  I learned new and useful tools as part of this course, and I could see this as an excellent foundational course for current and aspiring security team members in any organization.  Finding high quality training content is exceptionally valuable to me in my day job, and of course for me personally taking this course.</p>\n<p>As other GIAC alumni will tell you, since the GSEC is an open-book exam, developing good indexing skills, as others who have recounted their experiences state, is critical.  I followed <a href=\"http://www.theinfosecguy.com/2014/08/my-experience-with-giac-gsec-exam.html\">Josh Armentrout&rsquo;s index format</a>, and I walked into the exam with about 4 pages of indexes I developed throughout the course.  Admittedly, the way I learn best is by reading, so I spent my time in SEC 401&rsquo;s OnDemand video with Dr. Cole on x2 speed and scanning pages in the book as I went along for index-worthy concepts or terms.  I did not spend any time highlighting the books or listening to MP3&rsquo;s, just focusing on the audio and what I was reading.  I would finish a &lsquo;day&rsquo; at 2x in about 2 nights of my time, devoting about 5 hours a night for a couple of weeks to get through it all with a worthwhile index.  There&rsquo;s no specific tips or tricks to the content &ndash; the course syllabus plainly states what will be covered, and that&rsquo;s the reality of what OnDemand provided.  I will say read your entire book.  Sometimes key concepts have interesting nuances that end on the back of a page on a trailing paragraph.  Don&rsquo;t skip those.</p>\n<p>With my course, in addition to the self-study quizzes in the OnDemand portal - which test the content of SEC401, not the GSEC - I received two GIAC practice tests and the final GIAC exam test ready to schedule. While everything in the OnDemand portal is self-paced, repeatable, and not timed (other than the overall subscription access), the GIAC practice tests are delivered in the same format as the exam - timed, but they also provide explanations for any incorrectly answered questions.  The MSISE program has a learning community portal where generous souls who do not use both GIAC practice tests give away their tests to others who want extra shots.  While that&rsquo;s awfully nice of them, and I was tempted to do the same, I found value in taking both practice tests to test and refine the quality of my index.  I&rsquo;m glad I did, and would suggest never to give away a practice test if you feel you could use it to benefit your index or your comprehension of the breadth of the training topics.  (Hey, you paid for these practice tests, so you come first.)  I took my first practice test as an &lsquo;open internet&rsquo; variant where I would quickly Google something to answer the test, but then make sure my notes were fully fleshed out from what external sources could add.  My last practice test was &lsquo;closed internet, open book&rsquo; to mimic the actual exam experience, and this was a last test of my index for completeness, since that&rsquo;s all I would have on the test day.  Obviously, I carefully read the explanations to anything I answered incorrectly and tuned my notes and did additional readings to make sure I did not repeat any misfires.</p>\n<p><img class=\"detail__media__img-highres js-detail-img js-detail-img-high alignleft\" src=\"https://proxy.duckduckgo.com/iu/?u=https%3A%2F%2Fgeekandbooknerdsite.files.wordpress.com%2F2014%2F04%2Fkid20carrying20books.jpg&amp;f=1\" alt=\"April | 2014 | geekandbooknerd's Blog\" width=\"249\" height=\"187\">Finally, exam day came today!  I&rsquo;m no stranger to these types of tests or Pearson Vue, so the experience was predictable and suitable.  It is interesting walking into a Pearson Vue with an armful of books since most exams they test for allow no notes or books.  I came in with all six course books, the lab workbook, the network quick reference guide, my index, and a separate page of notes I made about common ports and protocols that were not on the network quick reference guide but were mentioned elsewhere in the course material.  I used everything I brought in, if only to take the exam at a &lsquo;leisurely&rsquo; pace and spend adequate time double checking my answers.</p>\n<p>Unlike the CISSP or CISM which are based on practical experience (with the exception of the CISSP&rsquo;s strange obsession with fire suppression controls&hellip;), the GSEC was much more knowledge-based, specifically on the SEC401 training materials.  So, the right answer is less likely to come from things you already know (come on, you don&rsquo;t really know ALL those nmap switches), but from what you have learned and can recall or find.  Arguably, this is a bit more realistic, as aren&rsquo;t all technical folks somewhat depending on their navigation of StackOverflow or Google-fu? :)</p>\n<p>It&rsquo;s hard to know from the outside whether SEC401 is custom tailored to the GSEC, or whether the GSEC is really testing SEC401, but they fit together like pieces of a puzzle.  Answers to questions often came nearly verbatim from the slides, or more often, the narrative, in the SEC401 books I had in tow.  That&rsquo;s not a knock on the SANS content or the GIAC exam - I call this out simply to advise those studying for the GSEC to intimately know the SEC401 material as it is presented in the books.  Treat the high-quality OnDemand video as a wonderful supplement, but don&rsquo;t go light on your reading and indexing of your spiral bound friends.  Also, do the labs, and repeat them until you could recognize a screenshot of output to a tool you covered in the curriculum or in a lab.  If you couldn&rsquo;t recognize a screenshot or command well enough by sight, you probably aren&rsquo;t soaking in the technical material at the level you need to demonstrate competency at the higher end of the spectrum.</p>\n<p>This process got me from a 89% on my cavalier run through the first practice test, to a 92% on my second practice test, to a 95% on exam day.  There&rsquo;s really no tricks to doing well on the GSEC or tricks the exam will try to play on you.  It is plainly written, very technical, and you would be a fool not to be prepared with the associated SANS training and a well-crafted index before sitting down to make an attempt.  (Check out <a href=\"https://tisiphone.net/2015/08/18/giac-testing/\">Lesley Carhart&rsquo;s great post</a> on studying and indexing too, if you have not already.)  Even if you might think &lsquo;I know all this&rsquo;, you probably don&rsquo;t have the GSEC cinched unless you give it serious attention and a good study.</p>\n<p>I hope this helps someone out there!</p>\n",
				
				"date_published": "2019-01-30T23:40:28+00:00",
				"url": "https://blog.seanmcelroy.com/2019/01/30/thoughts-on-passing-the-giac.html",
				"tags": ["Uncategorized"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2019/01/05/despite-doh-and-esni-with.html",
				"title": "Despite DoH and ESNI, with OCSP, web activity is insecure and not private",
				"content_html": "<h1>TL;DR</h1>\nCertificate Transparency (CT) logs increasingly provide virtually every TLS certificate to be identified by serial number.  Since OCSP responses are unencrypted and contain the serial number of the certificate as can be found in CT logs, as well as unsalted hashes of the certificate's Distinguished Name and public key, these can easily be profiled to compromise the privacy of clients even in the presence of DoH and ESNI privacy protections.\n<h1>Background</h1>\nA lot of great work has happened over the past few years in securing the web by strengthening encryption and improving user security indicators.  This helps users make informed decisions to keep their online activity secure and private and to thwart network adversaries from profiling users.  Man-in-the-middle attacks on the network often conjure images of someone breaking into a server room and installing some kind of interlocutor spyware device or splicing a network card.  Repeatedly, though, the internet service providers that bring the Internet to consumers' homes have demonstrated they will use their privileged position on the network to <a href=\"https://gigaom.com/2014/05/13/atts-gigapower-plans-turn-privacy-into-a-luxury-that-few-would-choose/\">sell private information</a> about consumer internet use or <a href=\"https://gizmodo.com/at-ts-watchtv-is-the-first-streaming-service-for-the-po-1827035425\">degrade services</a> from competitors.\n<p>Policy fixes like network neutrality are still in play, but these threats aren&rsquo;t unlikely one-offs that target individuals, they are systemic abuses by technology providers.  Technology fixes, though, are seeking to limit the visibility of web activity, such as the names of websites one visits or the content they download, indiscernible to anyone except the requester and the actual website operator.</p>\n<h1>Progress</h1>\nSignificant strides in improving the strength of encryption that makes data in transit unreadable, such as TLS 1.3, have squelched out vulnerabilities that stem from aging cryptographic algorithms and ciphers as well as certain threats that can affect the confidentiality of communications when an encryption key is leaked or a nation-state attacker.  However, metadata that is exchanged in the process of finding a server and securely establishing a connection, DNS and TLS with a Server Name Indicator (SNI), can still leak and poses both an existential privacy problem that is particularly troubling to vulnerable populations under repressive regimes as well as a method for sophisticated technology providers in 'free' societies to profile traffic for bandwidth discrimination, censorship, or profiteering.\n<p>A couple of standards have gained traction to address these weaknesses in DNS and TLS, with proposals termed <a href=\"https://hacks.mozilla.org/2018/05/a-cartoon-intro-to-dns-over-https/\">DNS over HTTPS (DoH)</a> and <a href=\"https://blog.cloudflare.com/esni/\">encrypted SNI (ESNI)</a>, respectively.</p>\n<h2>DoH</h2>\nDoH moves the plaintext game of 'telephone' whereby a client's request to resolve a URL into an IP address may traverse many different servers operated by many different entities to look up and return the answer.  DoH moves this communication from an unencrypted channel to an encrypted one, which still requires one to trust the privacy policy of the entity servicing the request, but does not need to presume the good behavior of every intermediate network and DNS server in the mix.  This is a very good thing we will see rolling out in the next few years in a much wider adoption.\n<h2>ESNI</h2>\nESNI is <a href=\"https://datatracker.ietf.org/doc/draft-ietf-tls-esni/?include_text=1\">a proposal</a> to plug a hole in an extension of the Transport Layer Security protocol (sometimes incorrectly referred to by its obsolete predecessor, SSL) which allows for encrypted communications to happen over a channel in a standard way for many applications.  In the web's early days, users would connect to a web server, such as Yahoo.com, and Yahoo.com would return a signed certificate that could be used to setup a secure communications channel.\n<p>However, as the web matured, methods for hosting many different sites on the same server or set of servers took off and there was no longer a 1:1 match for a domain name and a web server.  SNI was an extension that lets a client, like a web browser, specify &ldquo;I want Yahoo.com&rdquo; so the web site provider could return the correct, unique certificate to setup the channel for Yahoo.com, even though it could also be serving lots of other sites too.  However, the &ldquo;I want Yahoo.com&rdquo; is exchanged in plain-text before the certificate is provided and before an encrypted channel is established.</p>\n<p>That means savvy technology providers could just look here instead of logging DNS requests for similar data on what host names to which a customer is attempting to connect.  This is becoming far more viable as HTTPS Everywhere, user agent changes, and free certificate authorities like Lets Encrypt are making &lsquo;secure by default&rsquo; the new reality for the web.  More TLS means more encryption, but also more consistency in finding hostnames in SNI fields.</p>\n<h1>Problems</h1>\n<h2>CT Logs</h2>\nTLS is underpinned by a system of trust, particularly in the entities called Certificate Authorities that cryptographically sign certificates used to establish encrypted communications.  However, certificate authorities are fallible, and some have failed due to security breaches or by failing to abide by the rules and mis-issuing certificates.  Some of the most egregious offenses from failed certificate authorities like <a href=\"https://www.computerworld.com/article/2493095/data-center/one-year-after-diginotar-breach--fox-it-details-extent-of-compromise.html\">DigiNotar</a>, <a href=\"https://blog.mozilla.org/security/2018/03/12/distrust-symantec-tls-certificates/\">Symantec</a>, and <a href=\"https://www.thesslmart.com/chrome-firefox-to-distrust-wosign-startcom-certs/\">WoSign/StartCom</a> have resulted in technology solutions that make it possible to hold them accountable.  Certificate Transparency (CT) logs are a public ledger of certificates issued by authorities that allow their behavior to be monitored, but also create central clearinghouses of certificates that can be looked up by name or serial number.  More on that soon.\n<h2>OCSP</h2>\nWhen a certificate is compromised, a certificate authority can revoke it.  While normally a certificate has a limited duration noted by an immutable expiration date embedded into it, certificates may be prematurely revoked if the holder or the authority is compromised.  The Online Certificate Status Protocol (OCSP) is a protocol clients like web browsers user to verify a certificate it receives is still valid. OCSP lets a client ask \"I just received this certificate for Yahoo.com, but is it valid?\"  The request is obscure, but not secure:\n<img class=\"alignnone size-full wp-image-490\" src=\"https://seanmcelroy.micro.blog/uploads/2026/497f09c087.jpg\" alt=\"oscprequest\" width=\"745\" height=\"710\">\n<p>The request has a one-way hash of the distinguished name and public key in the certificate as well as the serial number of the certificate.  Unsalted hashes mean anyone could poll CT logs for all distinguished names, build their own hash lookup dictionary, and then compare this value to their dictionary.  However, the unhashed serial number makes this far easier, as many CT logs support direct lookup of certificates by their serial number.  In the following screenshot, you can see a trivial lookup to find out my lab virtual machine was connecting out to <a href=\"https://support.mozilla.org.\">support.mozilla.org.</a></p>\n<img class=\"alignnone size-full wp-image-491\" src=\"https://seanmcelroy.micro.blog/uploads/2026/e2216ec257.jpg\" alt=\"ctlookup\" width=\"1292\" height=\"626\">\n<h1>Summary</h1>\nThis is not a new vulnerability.  In fact, <a href=\"https://tools.ietf.org/html/rfc6960\">RFC 6960</a>, which defines OCSP, explicitly states:\n<blockquote>Where privacy is a requirement, OCSP transactions exchanged using HTTP MAY be protected using either Transport Layer Security/Secure Socket Layer (TLS/SSL) or some other lower-layer protocol.</blockquote>\nIncorrectly, some presume OCSP must be performed over insecure HTTP to address a address a 'chicken and egg' problem that would arise from trying to validate the certificate of a secure OCSP site to validate the certificate of another secure site.  While implementation details could be non-trivial, solutions like pinning the TLS certificates of well-known OCSP responders could address that challenge.\n<p>It is important, though, to consider that in the cat-and-mouse game of threats to privacy and privacy-protecting technologies, OCSP is a more readily available source of metadata on users as HTTPS adoption increases, CT logs become mandatory and pervasive, and insecure OCSP communications dominate the responder implementations.  As other privacy holes are addressed, such as DoH and ESNI, to keep users' Internet activity private, OCSP is a challenge at scale to address as well.</p>\n",
				
				"date_published": "2019-01-05T18:51:28+00:00",
				"url": "https://blog.seanmcelroy.com/2019/01/05/despite-doh-and-esni-with.html",
				"tags": ["Uncategorized"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2017/06/24/powershell-oneliner-to-find-outbound.html",
				"title": "PowerShell one-liner to find outbound connectivity via WinRM",
				"content_html": "<p>In controlled environments, it&rsquo;s useful to know when outbound connectivity is not restricted to a predefined list of required hosts, as many standards like PCI require.  Here&rsquo;s a helpful one-liner that will query your Active Directory instance for computer accounts that are enabled, and then for each of them try to connect to a site from that machine, as orchestrated by WinRM.  If you use this script, just know that you will probably see a sea of errors for machines that connect be reached from your source host via WinRM.  My go-to site for testing non-secure HTTP is asdf.com, but you could use anything target and port you desire based on what should not be allowed in your environment.  I have changed the snippet below to example.com (which will not work) so I don&rsquo;t spam the poor soul who runs asdf.com, but you should replace that with google.com or whatever host to which you wish to verify connectivity.</p>\n<pre>Invoke-Command -ComputerName (Get-ADComputer -Filter {Enabled -eq \"True\"}\n -Property Name,Enabled | foreach { $_.Name }) -ScriptBlock\n { Test-NetConnection -Port 80 \"example.com\" | Select TcpTestSucceeded }</pre>\n<p>The output will be dropped into look something like this:</p>\n<pre> TcpTestSucceeded PSComputerName RunspaceId \n ---------------- -------------- ---------- \n             True YOUR-HOST-1    d5fd044c-c268-460e-a274-d3253adc8ce2 \n             True YOUR-HOST-2    98206f71-80c1-4e7e-a467-fec489c542ee \n            False YOUR-HOST-3    d0b6cf57-e833-44a6-a7bb-aebd4d854b5c \n             True YOUR-HOST-4    14af618b-1ca7-4c1f-bb56-ce58dbd4af94</pre>\n<p>It&rsquo;s a great sanity check before an audit or after major changes to your network architecture or security controls.  Enjoy!</p>\n<p> </p>\n<p> </p>\n<p> </p>\n",
				
				"date_published": "2017-06-24T23:35:28+00:00",
				"url": "https://blog.seanmcelroy.com/2017/06/24/powershell-oneliner-to-find-outbound.html",
				"tags": ["Security","Programming","Aside"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2017/05/27/sql-injection-with-new-relic.html",
				"title": "SQL Injection with New Relic [PATCHED]",
				"content_html": "<h2>Background</h2>\nFirst off, I have found New Relic to be a great application performance monitoring (APM) tool.  Its ability to link transaction performance from the front-end all the way to back-end database queries that slow your web application is pretty awesome.  This feature lets you see specific queries that are running slowly, including the query execution plans and how much time is spent on processing various parts of a database request.  From their <a href=\"https://docs.newrelic.com/docs/apm/applications-menu/monitoring/viewing-slow-query-details\" target=\"_blank\" rel=\"noopener noreferrer\">online documentation</a>, the interface looks similar to this:\n<img style=\"max-width:100%;\" src=\"https://docs.newrelic.com/sites/default/files/thumbnails/image/APM-Databases-Slow-query-trace.png\">\n<p>What&rsquo;s not so awesome is when your APM&rsquo;s method for retrieving this data creates a <a href=\"https://www.owasp.org/index.php/SQL_Injection\" target=\"_blank\" rel=\"noopener noreferrer\">SQL injection</a> flaw in your application that wasn&rsquo;t there before.  In October 2016, I became aware of some strange errors when a DBA was trying to load SQL Server trace files into <a href=\"https://support.microsoft.com/en-us/help/830232/pssdiag-data-collection-utility\" target=\"_blank\" rel=\"noopener noreferrer\">PSSDiag</a>, due to a formatting problem in the trace file itself.  Our DBA discovered that unclosed quotation marks were causing problems with PSSDiag loading trace files.  So, how could an unclosed quotation mark even be happening?  It&rsquo;s a <a href=\"https://www.owasp.org/index.php/Testing_for_SQL_Injection_(OTG-INPVAL-005)\" target=\"_blank\" rel=\"noopener noreferrer\">hallmark</a> of a SQL injection exploit, and so I began digging.</p>\n<p>It appeared our ORM (NHibernate at the time) was sending unparameterized queries, and one of the field values had an unescaped quotation mark, which was causing the error in PSSDiag.  However, in other cases the same query, unique to an area of our code, would be issued with parameters.  Upon further digging, it actually appeared our application was submitting the same query twice, first with the parameterized query version, and a second with parameter values replaced into the query string, sandwiched with a SET SHOWPLAN_ALL.  It looked a bit like this:</p>\n<pre>exec sp_executesql N'INSERT INTO dbo.Table (A, B, C) \nVALUES (@p0, @p1, @p2);select SCOPE_IDENTITY()'\n,N'@p0 uniqueidentifier,@p1 uniqueidentifier, @p2 nvarchar(50)'\n,@p0='{Snipped}',@p1='{Snipped}',@p2=N'I don''t even'</pre>\n<p>Followed by:</p>\n<pre>SET SHOWPLAN_ALL ON\nINSERT INTO dbo.Table (A, B, C)\nVALUES ('{Snipped}', '{Snipped}', 'I don't even');select SCOPE_IDENTITY()</pre>\n<p>As you can see in the first example created by NHibernate, the word &ldquo;don&rsquo;t&rdquo; was properly escaped; however, in the subsequent execution, it was not.  This second statement is sent by our very same application process, which New Relic will instrument using the <a href=\"https://msdn.microsoft.com/en-us/library/ms230825(v=vs.110).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">ICorProfilerCallback2</a> profiler hook to retrieve application performance statistics.  But it doesn&rsquo;t just snoop on the process, it actually hijacks database connections to periodically piggyback on their &lsquo;echo&rsquo; of requests to retrieve metrics used to populate their slow queries feature.  The <a href=\"https://docs.microsoft.com/en-us/sql/t-sql/statements/set-showplan-all-transact-sql\" target=\"_blank\" rel=\"noopener noreferrer\">SET SHOWPLAN_ALL</a> directive causes the subsequent request not actually to return data, but to just return the execution plan.</p>\n<p>(DBA&rsquo;s will note this is actually not a reliable way retrieve this data at all, as parameterized queries can and often do have very different query execution plans when parameter sniffing and lopsided column statistics are in play.  But that&rsquo;s how New Relic does it.)</p>\n<p><strong>This is pretty bad</strong>, because now virtually <em>every</em> user-provided input that is sent to your database, even if programmed using secure programming practices to avoid SQL injection flaws, becomes vulnerable with New Relic is installed with the Slow Queries feature enabled.  That being said, New Relic does not send this second &lsquo;show plan&rsquo; and repeated statement set for every query.  It samples, appending it only onto some executions of any given statement.  An attacker attempting to exploit this would not be able to do so consistently; although, repeated attempts on something like the username field of a login screen, which in many systems is likely log to a database table that stores usernames of failed login attempts, would occasionally succeed when the subsequent SHOWPLAN_ALL and unparamaterized version of the original query is injected at the end of the request by New Relic.</p>\n<h2>Timeline</h2>\n<ul>\n\t<li>October 5, 2016: Notified New Relic</li>\n\t<li>October 5: New Relic acknowledges issue and provides a workaround (disabling explain plans)</li>\n\t<li>October 6: New Relic's application security team responds with details explaining why they believe the issue is not exploitable as a security vulnerability. Their reasoning is based on the expected behavior of SHOWPLAN_ALL, which would not execute subsequent commands</li>\n\t<li>October 6: I provide a specific example of how to bypass the 'protection' of the preceding SHOWPLAN_ALL statement that confirms this is an exploitable vulnerability.</li>\n\t<li>October 6 New Relic confirms the exploit and indicates it is targeted for resolution in their upcoming 6.x version of the New Relic .NET Agent.  I confirm the issue in New Relic .NET Agent 5.22.6.</li>\n\t<li>October 7: New Relic indicates they will not issue a CVE for this issue.</li>\n\t<li>October 12: New Relic updates us a fix is still in development, but a new member of their application security team questions the exploit-ability of the issue.</li>\n\t<li>October 12: I provide an updated, detailed exploit to the New Relic security team to demonstrate how to exploit the flaw.</li>\n\t<li>November 8: Follow-up call with New Relic security team and .NET product manager on progress.  They confirm they <a href=\"https://docs.newrelic.com/docs/release-notes/agent-release-notes/net-release-notes/net-agent-631230\" target=\"_blank\" rel=\"noopener noreferrer\">have resolved the issue as of the New Relic .NET Agent 6.3.123.0</a>.</li>\n\t<li>November 9: .NET Agent with issue fixed addressed.</li>\n\t<li>May 26, 2017: Public disclosure</li>\n</ul>\n<h2>Conclusion</h2>\nFirst off, I want to applaud New Relic on their speedy response and continued dialogue as we worked through the communication of this issue so they understood how to remediate it.  On our November 8 call, I specifically asked if New Relic would reconsider their stance of not issuing a CVE for the issue, or at least clearly identify 6.3.123.0 as a security update so developers and companies that use this agent would know they needed to prioritize this update.  They thoughtfully declined, and I did inform them that I would then be publicly disclosing the vulnerability if they did not.\n<p><strong>Even if I don&rsquo;t agree with it</strong>, I understand the position companies take about not proactively issuing CVE&rsquo;s.  However, I do believe software creators must clearly indicate when action is needed by their users to update software they provide to resolve security vulnerabilities. Many IT administrators take the &lsquo;if it&rsquo;s not broken, don&rsquo;t update it&rsquo; approach to components like the New Relic .NET Agent, and if no security urgency is communicated for an update, it could take months to years for it to be updated in some environments.  While some companies may be worried about competitors' narratives or market reactions to self-disclosing, the truth is vulnerabilities will eventually be disclosed anyway, and providing an appropriate amount of disclosure and timely communications for security fixes is a sign of a mature vulnerability management program within a software company.</p>\n<p>Also, be sure if you put any mitigation techniques in place that they actually work.  We stumbled upon another bug in working around the issue that was subsequently fixed in <a href=\"https://docs.newrelic.com/docs/release-notes/agent-release-notes/net-release-notes/net-agent-6116130\" target=\"_blank\" rel=\"noopener noreferrer\">6.11.613</a> where trying to turn off the &lsquo;slow query&rsquo; analysis feature per the New Relic documentation did not consistently work.</p>\n<p>Given the potential gravity of this issue, I have quietly sat on this for almost 7 months to allow for old versions of this agent to be upgraded by New Relic customers, in the name of <a href=\"https://en.wikipedia.org/wiki/Responsible_disclosure\">responsible disclosure</a>.  I have not done any testing on versions of New Relic agents other than the .NET one, but I would implore security researchers to test agents from any APM vendor that collects execution plans as part of their solution for this or similar weaknesses.</p>\n",
				
				"date_published": "2017-05-27T01:10:31+00:00",
				"url": "https://blog.seanmcelroy.com/2017/05/27/sql-injection-with-new-relic.html",
				"tags": ["Security"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2015/08/25/first-impressions-matter.html",
				"title": "First Impressions Matter",
				"content_html": "<p>When it comes to researching vendors, first impressions matter so much.  I tend to judge any potential vendor by its sales apparatus, not just because it is the first impression, but because that positioning and interaction will tell you so much more than any press release, executive &lsquo;corporate culture&rsquo; communication, or other third-party source of information on financial or industry strength.  Things I notice right off the bat that influence my decision to continue engagement or build trust:</p>\n<h2>Is the sales channel optimized?</h2>\nBuilding great companies and great products is all about optimization at a later stage of an organization's maturation life cycle.  Idea-driven founding staff are joined or replaced by data-driven staff as a company's offering is validated and it grows to benefit from economies of scale and to show profitability to patient investors and equity holders.  The distance between my interest and the vendor's name recognition is a marketing issue, but the distance between my identification of a vendor and getting a meaningful response from their sales organization is a sales/company issue.  If I'm clicking through a brochure-ware website to find the place to start engagement, filling out a general 'Contact Us' form, navigating a tedious phone tree, or heaven-forbid, clicking a 'mailto:' link to type my interest, then I've already learned a lot about your company.  I've learned one of the following statements is true:\n<ol>\n\t<li>The number of client contacts you deal with through this channel is relatively small: you are new or slow to acquire customers through it</li>\n\t<li>Your company is too focused on the ideation and 'fun' phase of the business to optimize your sales channel - your company may not be mature enough for my needs</li>\n\t<li>Your company is too focused serving existing customers (keeping the wheels on) to work on growing your business by optimizing sales channels - your company may not be ready for my needs</li>\n\t<li>Your company is mature but not thinking about data-driven results, which tells me your product probably isn't either.</li>\n</ol>\n<h2>What is the quality of the first contact?</h2>\nDid the person who responds to my inquiry bother to look up the domain of my e-mail address to check out what my company does?  Does that sales executive reference recent PR releases we made?  This is a high-quality contact and this action shows me your sales executives aren't quote-monkeys or order-takers, they are relationship-builders.  Or did I just get a form letter thank me for my form entry and letting me know someone may get back to me about whatever my interest might be?  If it is the latter, this tells me:\n<ol>\n\t<li>Your company will require me to tell, and you probably won't ask.  I'll need to know what I want and be prepared to demand.  Since from the start of the relationship, there was little concern for finding a good fit, I will have extra heavy lifting to do.</li>\n\t<li>If you are asking what my interest is and you don't already know, then that probably means you haven't placed me in any segment or internal classification that represents the nature of my potential demand.  That tells me the out-of-the-box customization of the solution may be low, or if not, you are not capitalizing on the specialized needs of different classes of customers.</li>\n\t<li>If I get an \"I don't know\" in the first conversation, that is okay, but it tells me I'm either working with someone that does not know their product well (new or inexperienced), or the sales group is not connected to the product group, which is a more fundamental problem.  The most important communication line is (in my view) between sales and product, and secondly between sales and operations to ensure in order that: (1) pre-sales the right solution is sold to a customer ... if that doesn't happen everything else will fail ... and (2) post-sales the requirements are appropriately communicated to deliver a synchronized expectation and final result.</li>\n</ol>\n<h2>What is the speed of the first quality contact?</h2>\n<ol>\n\t<li>If I get a poor-quality first contact very fast, I presume I'm talking to someone young and hungry.  This can be a good sign if I need a lot of attention or customization and you're not a large player.  This is a very bad sign if you have a signature single product and are an established company, as I assume there's inadequate sales training or high sales churn, both of which send a negative signal about your company's position and our potential together.</li>\n\t<li>If I get a high-quality first contact very slowly, I'm not thrilled, but I'm willing to wait and pay for quality.  Not everyone is, but that's how I do business.</li>\n\t<li>If I get a poor-quality contact very slowly, you really shouldn't be in business, and you probably won't be anymore very soon.</li>\n</ol>\n \n",
				
				"date_published": "2015-08-25T17:57:23+00:00",
				"url": "https://blog.seanmcelroy.com/2015/08/25/first-impressions-matter.html",
				"tags": ["User Experience"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2015/06/25/alkami-genesis.html",
				"title": "Alkami: Genesis",
				"content_html": "<p>In the summer of 2008, I was preparing a large strategic product shift within Myriad Systems, Inc. to unify a suite of ancillary banking productions I had built and managed: remote deposit capture, merchant capture, expedited payments, e-Statements, e-Notices, check imaging, and a one-to-one marketing solution among many others. A key opportunity presented itself in that we had several large and progressive financial institution clients that were interested in what an MSI online banking offering could look like, particularly given the relatively poor user experience in the online banking offerings at the time.  This would have completed a big piece of the end-user product portfolio for MSI, and while as daunting as online banking from the ground-up is, it stood to provide substantial strategic value to our whole suite.</p>\n<p>Computer Services, Inc. began courting MSI and started a full acquisition in August of 2009. It was clear CSI’s intent was to maximize the value of the print and mail operational assets of MSI, but it had little interest in its online banking products other than to preserve existing revenue streams. This disinterest in the strategic vision of the online web applications as a product portfolio was the impetus for me to pursue my personal career interests of building a best-in-breed online banking solution outside of the MSI umbrella.</p>\n<p>Jeff Vetterick and Richard Owens, two industry colleagues that had previously had stints at MSI, reached out when they heard of my desire to continue to build online banking and move on and encouraged me to reach out to Gary Nelson, an acquaintance who was part of the very successful build and sale of Advanced Financial Services to Metavente (an interesting and great story in of itself), who had interest in this as well. After AFS, Gary had many interests and projects, a significant one being part of an idea to build a learning management system that provided tools for schools to impart educational content in an online tool where students would have a fictitious bank account balance and through different learning modules, understand concepts of spending, budgeting, and the time-value of money.</p>\n<p>When I spoke to Gary in September, I found this initiative was in wind-down: the project had exceeded its funding, and only an IT manager had been retained as a temporary contractor to document and turn over all the company’s assets. Gary engaged me as a consultant to perform an analysis of the source code developed by that team to determine if there was any value in it as an asset for sale as the company was closed up. I reviewed the company’s source and patents, but when I started looking at the few cloud VM’s and pulled open the Subversion repository where the source code was to be, I found a shocking lack of value: what did exist were some architectural documents and some demoware in the form of static screens coded into a .NET MVC ‘shell project’ that had no actual implementation or integration of the key concepts around educational content delivery and assessment. Looking back at the Finnovate presentation the team from this company did, I found only that minimal proof of concept presented on stage, but little more complete.</p>\n<p>The internal company documentation in the form of ‘wikis’, agile storyboards, and some unorganized developer notes showed no cohesive technical direction or architectural plan. When I began reviewing invoices for consultants and local contractors, a sad picture materialized: I felt Gary and other investors had been somewhat duped by a mixture of technical ineptitude and probably some overbilling greed by people and local development ‘firms’. I delivered the news that what assets I could find and review had little fire-sale value, other than perhaps one patent that had some intrinsic value, but no implementation. I exemplified this situation by opening the source code for the portion of the system that purported to calculate a ‘relationship score’ about how much an end-user understood financial literacy content and how their behavior in their accounts, transactions, and progress in meeting their financial goals; the source code simply ran in an endless empty loop, doing nothing. Demoware.</p>\n<p>After delivering the news to Gary and preparing for whatever my next endeavor would end up being, Gary suggested I reach out to Stephen Bohanon, a consultant with Catalyst Consulting Group who had previous been a high-performing salesperson with AFS. After several discussions, it became clear Gary had an appetite to try a pivot in the financial technology web application space, and both Stephen and I were interested in building a world-class online banking solution - he as a formidably talented sales executive to build relationships and grow the organization, and myself to grow a technical team that would architect and build our next-generation online banking user experience.</p>\n<p>And with no pre-existing source code, and only great ideas, tremendous perseverance, and some money (thanks, Gary!), we founded Alkami.</p>\n",
				
				"date_published": "2015-06-25T19:28:25+00:00",
				"url": "https://blog.seanmcelroy.com/2015/06/25/alkami-genesis.html",
				"tags": ["Uncategorized"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2014/10/15/security-advisory-for-financial-institutions.html",
				"title": "Security Advisory for Financial Institutions: POODLE",
				"content_html": "<p>Yesterday evening, Google made public a new form of attack on encrypted connections between end-users and secure web servers using an old form of encryption technology called SSL 3.0.  This attack could permit an attacker who has the ability to physically disrupt or intercept an end-user’s browser communications to execute a “downgrade attack” that would could cause an end-user’s web browser to attempt to use the older SSL 3.0 encryption protocol rather than the newer TLS 1.0 or higher protocols.  Once an attacker successfully executed a downgrade attack on an end-user, a “padded oracle” attack could then be attempted to steal user session information such as cookies or security tokens, which could be further used to gain illicit access to an active secure website sessions.  This particular flaw is termed the POODLE (Padding Oracle On Downgraded Legacy Encryption) attack.  At this time this advisory was authored, US-CERT had not yet published a vulnerability document for release yet, but has reserved advisory number <a href=\"https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-3566\" target=\"_blank\">CVE-2014-3566</a> for its publication, expected today.</p>\n<p>It is important to know this is not an attack on the secure server environments that host online banking and other end-user services, but is a form of attack on end-users themselves who are using web browsers that support the older SSL 3.0 encryption protocol.  For an attacker to target an end-user, they would need to be able to capture or reliably disrupt the end-user’s web browser connection in specific ways, which would generally limit the scope of this capability to end-user malware or attackers on the user’s local network or that controlled significant portions of the networking infrastructure an end-user was using.  Unlike previous security scares in 2014 such as Heartbleed or <a title=\"Security Advisory for Financial Institutions: Shell Shock\" href=\"http://blog.seanmcelroy.com/2014/09/25/shell-shock/\">Shellshock</a>, this attack targets the technology and connection of end-users.  The nature of this attack is one of many classes of attacks that exist that target end-users, and is not the only such risk posed to end-users who have an active network attacker specifically targeting them from their local network.</p>\n<p>The proper resolution for end-users will be to update their web browsers to versions that have not yet been released that completely disable this older and susceptible SSL 3.0 technology.  In the interim, service providers can disable SSL 3.0 support, with the caveat that IE 6 users will no longer be able to access sites with SSL 3.0 without making special settings adjustments in their browser configuration.  (But honestly, if you are keeping IE 6 a viable option for your end-users, this is one of many security flaws those issues are subject to).  Institutions that run on-premises software systems for their end-users may wish to perform their own analysis of the POODLE SSL 3.0 security advisory and evaluate what, if any, server-side mitigations are available to them as part of their respective network technology stacks.</p>\n<p>Defense-in-depth is the key to a comprehensive security strategy in today&rsquo;s fast-developing threat environment.  Because of the targeted nature of this type of attack, and its prerequisites for a privileged vantage point to interact with an end-user’s network connection, it does not appear to be a significant threat to online banking and other end-user services, and this information is therefore provided as a precaution and for informational purposes only.</p>\n<p>All financial institutions should subscribe to US-CERT security advisories and to monitor the publication of CVE-2014-3566 once released for any further recommendations and best practices.  The resolution for end-users of updated versions of Chrome, Firefox, Internet Explorer, and Safari which remove all support for the older SSL 3.0 protocol will be made through their respective vendor release notification channels.  For more information from US-CERT once published, refer to the Google whitepaper directly at <a href=\"https://www.openssl.org/~bodo/ssl-poodle.pdf\"><a href=\"https://www.openssl.org/~bodo/ssl-poodle.pdf\">https://www.openssl.org/~bodo/ssl-poodle.pdf</a></a></p>\n",
				
				"date_published": "2014-10-15T14:24:41+00:00",
				"url": "https://blog.seanmcelroy.com/2014/10/15/security-advisory-for-financial-institutions.html",
				"tags": ["Security"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2014/10/02/alkami-a-retrospective.html",
				"title": "Alkami: A Retrospective",
				"content_html": "<p>What a wild and crazy journey the last five years have been.</p>\n<p>When I started this blog in 2009, it was shortly after I had inked a deal with an angel investor and journeyed down the road with him and my other co-founder and established Alkami Technology.  Against significant odds, this October marks the five year anniversary of a roller-coaster ride on up, which galvanized Alkami as the clear leader in the online banking space.  Before jumping into this endeavor, I was no stranger to walking products from idealization to realization or running enterprise services in a SaaS model.  But doing all that against the tremendous downside risks of the start-up world, as the new kid on the block among a world of established, very-well funded competitors has been challenging. Actually, it&rsquo;s been brutal.</p>\n<p>Reflecting on the past sixty months, I&rsquo;ve started to pull together my notes from the early days, both before and after founding Alkami, and I will be commemorating this milestone with a series of blog posts on some company history - the why and how, as well as some valuable and hard-learned lessons along the way.  No one, no company finds tremendous success spontaneously.  While a Inc 500 splash piece on a company might portray success like a serendipitous fairy tale, only through a voracious appetite for risk, an iron stomach for failure, and a committed and skilled team does any great company find its footing.  It&rsquo;s a great feeling to walk into the office every week and see new, fantastic talent we&rsquo;ve added to our team and forward-leaning designs and concepts in our flagship solution.  It&rsquo;s also a very satisfying one to know your personal efforts and sacrifices made that team and that company possible.</p>\n<p>This series of posts will not be a beating of the chest or self-congratulatory account of our accolades.  Our work is far from over, and I judge success on a much longer time horizon.  But it will be a real account of our origin story, entrepreneurship, missteps and course correction, and moving from start-up to scale-out in a slow sales cycle, highly-regulated industry.  It&rsquo;s one thing to have a hip product idea you incubate through an accelerator and debut on a demo day. It&rsquo;s a very different thing to bootstrap a firm and an entire platform where you have to answer a few hundred RFP questions to get a prospect to even talk with you, many other steps to get just one sale, and many sales to get that kind of investor attention.</p>\n<p>Those pieces are now in place and solidifying every day as we take an aggressive product and technical vision to its successful conclusion.  I&rsquo;m honored to have found great working partners, worked (and still mostly <em>continue</em> to work) with some of the most committed and skilled people across a variety of disciplines along the way.  As we look back in retrospect at five formative years, I&rsquo;m eager to chronicle our story and to add others who will extend and craft our bright future. Stay tuned.</p>\n",
				
				"date_published": "2014-10-02T03:00:31+00:00",
				"url": "https://blog.seanmcelroy.com/2014/10/02/alkami-a-retrospective.html",
				"tags": ["Uncategorized"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2014/09/25/security-advisory-for-financial-institutions.html",
				"title": "Security Advisory for Financial Institutions: Shell Shock",
				"content_html": "<h1>“Shell Shock\" Remote Code Execution and Compromise Vulnerability</h1>\nYesterday evening, DHS National Cyber Security Division/US-CERT published CVE-2014-6271 and CVE-2014-7169, outlining a serious vulnerability in a widely used command line interface (or shell) for the Linux operating system and many other *nix variants.  This software bug in the Bash shell allows files to be written on remote devices or remote code to be executed on remote systems by unauthenticated, unauthorized malicious users.  Because the vulnerability involves the Bash shell, some media outlets are referring to this vulnerability as Shell Shock.\n<h2>Nature of Risk</h2>\nBy exploiting this parsing bug in the Bash shell, other software on a vulnerable system, including operating system components, can be compromised, including the OpenSSH server process and the Apache web server process. Because this attack vector allows an attacker to potentially compromise any element of a vulnerable system, effects from website defacement to password collection, malware distribution, and retrieval of protected system components such as private keys stored on servers are possible, and the US-CERT team has rated this it's highest impact CVSS rating of 10.0.\n<p>Please be specifically aware that a patch was provided to close the issue for the original CVE-2014-6271; however, this patch did not sufficiently close the vulnerability.  The current iteration of the vulnerability is CVE-2014-7169, and any patches applied to resolve the issue should specifically state they close the issue for CVE-2014-7169.  Any devices that are vulnerable and exposed to any untrusted network, such as a vendor-accessible extranet or the public Internet should be considered suspect and isolated and reviewed by a security team due to the ability for &ldquo;worms&rdquo;, or automated infect-and-spread scripts that exploit this vulnerability, to quickly affect vulnerable systems in an unattended manner.  Any affected devices that contain private keys should have those keys treated as compromised and have those keys reissued per your company&rsquo;s information security policies regarding key management procedures.</p>\n<h2>Next Steps</h2>\nAll financial institutions should immediately review their own environments to determine that no other third-party systems that are involved in serving or securing the online banking experience, or any other publicly-available services, are running vulnerable versions of the Bash shell.  Any financial institution that provides any secure services with Linux or *nix variants running a vulnerable version of the Bash shell could be at risk no matter what their vendor mix. If any vulnerable devices are found, they should be treated as suspect and isolated per your incident response procedures until they are validated as not affected or remediated.  All financial institutions should immediately and thoroughly review their systems and be prepared to change passwords on and revoke and reissue certificates with private key components stored on any compromised devices.\n<p>For further reading on this issue:</p>\n<ul>\n\t<li><a href=\"https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169\">US-CERT CVE-2014-7169</a></li>\n\t<li><a href=\"https://www.us-cert.gov/ncas/current-activity/2014/09/24/Bourne-Again-Shell-Bash-Remote-Code-Execution-Vulnerability\">Bourne Again Shell (Bash) Remote Code Execution Vulnerability</a></li>\n</ul>\n",
				
				"date_published": "2014-09-25T16:15:34+00:00",
				"url": "https://blog.seanmcelroy.com/2014/09/25/security-advisory-for-financial-institutions.html",
				"tags": ["Security"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2014/08/07/enduser-credential-security.html",
				"title": "End-User Credential Security",
				"content_html": "<p>This week&rsquo;s announcement that a Russian crime syndicate has amassed <a title=\"Russian Hackers Amass Over a Billion Internet Passwords\" href=\"http://www.nytimes.com/2014/08/06/technology/russian-gang-said-to-amass-more-than-a-billion-stolen-internet-credentials.html\" target=\"_blank\">1.2 billion unique usernames and passwords across 420,000 websites</a> would seem like startling news in 72-point font on the front of major newspapers, if it wasn&rsquo;t sad it was such a commonplace announcement these days.  With four more months to go and still higher than the estimated <a title=\"20 Largest Data Breaches of 2013\" href=\"https://www.linkedin.com/today/post/article/20140224081155-67886711-20-biggest-data-breaches-of-2013\" target=\"_blank\">823 million compromised credentials</a> part of 2013 breaches affecting Adobe to Target, it&rsquo;s from Black Hat 2014 I find myself thinking about what we as ISV&rsquo;s, SaaS providers, and security professionals can do to protect users in the wake of advanced persistent threats and organized, well-funded thieves wreaking havoc on the digital identities and real assets of our clients and customers.</p>\n<p>Unlike Heartbleed or other server-side vulnerabilities, this particular credential siphoning technique obviously targeted users themselves to affect so many sites and at least 542 unique addresses affecting at least half that many unique users.  Why are users so vulnerable to credential-stealing malware?  To explore this issue, let&rsquo;s immediately discard a tired refrain inside software houses everywhere: users aren&rsquo;t dumb.  All too often, good application security is watered down to its least secure but most useful denominator for an overabundance of concern that secure applications may frustrate users, lower adoption, and reduce retention and usage.  While it is true that the more accessible the Internet becomes, the wider the spectrum the audience that uses it, from the most expertly capable to the &lsquo;last-mile&rsquo; of great grandparents, young children, and the technologically unsophisticated.  However, this should neither be grounds to dismiss end-user credential security as a concern squarely in service provider&rsquo;s court to address nor should it be an excuse to fail to provide adequately secure systems.  End-user education is our mutual responsibility, even if that means three more screens, additional prompts to confirm identity or action, or an out-of-band verification process.  Keeping processes as stupefying simple as possible because our SEO metrics show that&rsquo;s the way to marginally improve adoption, reduce cart abandonment, or improve site usage times breeds complacency that ends up hurting us all in the long-run.</p>\n<p>Can we agree that 1FA needs to end?  In an isolated world of controlled systems, a username and password combination might have been a fair assertion of identity.  Today&rsquo;s systems, however, are neither controlled or isolated - the same tablets that log into online banking also run Fruit Ninja for our children, and we pass them over without switching out any concept of identity on a device that can save our passwords and represent them without any authentication.  Small-business laptops often run without real-time malware scanning software, easily harvesting credentials through keystroke logging, MitM attacks, cookie stealing, and a variety of other commonplace techniques.  Username and passwords fail us because they can be saved and cached just as easily as they can be collected and forwarded to command and control servers is Russia or elsewhere.  I&rsquo;m not one of those anarchists advocating &lsquo;death to the password&rsquo; (remember Vidoop?), but using knowledge-based challenges (password, out-of-wallet questions, or otherwise) as the sole factor of authentication needs to end.  And it needs to end smartly: sending an e-mail &lsquo;out of band&rsquo; to an inbox loaded in another tab on the same machine, or an SMS message read by Google Voice in another tab means your &lsquo;2FA&rsquo; is really just one factor layered twice instead of two-factor authentication.  A few more calls into the call center to help users cope with 2FA will be far cheaper in the long-run than the fallout of a major credential breach that affects your sites users.</p>\n<p>We need to also discourage poor password management: allowing users to choose short or non-complex passwords and warning them about their poor choices is no excuse - we should just flatly reject them.  At the same time, we need to recognize that forcing users to establish too complex of a password will encourage them to establish a small number of complex passwords and reuse them across more sites.  This is one of the largest Achilles&rsquo;s Heels for end-users: when a compromise of one site does occur, and especially if you have removed the option for users to establish a username not tied to their identity (name, e-mail address, or otherwise), you have made it tremendously easier for those who have gathered credentials from one site to have a much higher likelihood of exploiting them on your site.  Instead, we should consider nuances to each of complexity requirements that would make it likely a user would have to generate a different knowledge-based credential for each site.  While that in of itself may increase the chance a user would &lsquo;write a password down&rsquo;, a user who stores all their passwords in a password manager is still arguably more secure than the user who users one password for all websites and never writes it anywhere.</p>\n<p>Finally, when lists of affected user accounts become available in uploaded databases of raw credentials that are leaked or testable on sites such as <a title=\"Have I Been Pwned?\" href=\"https://haveibeenpwned.com/\" target=\"_blank\"><a href=\"https://haveibeenpwned.com/\">https://haveibeenpwned.com/</a></a> - ACT.  Find out your users that have overlap with compromised credentials on other sites, and proactively flag or lock their accounts or at least message to them to educate and encourage good end-user credential security.  We cannot unilaterally force users to improve the security of their credentials, but we can educate them, and we can make certain their eventual folly through our inaction.</p>\n",
				
				"date_published": "2014-08-07T22:30:28+00:00",
				"url": "https://blog.seanmcelroy.com/2014/08/07/enduser-credential-security.html",
				"tags": ["Social Responsibility","Security"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2014/04/02/when-to-ride-the-service.html",
				"title": "When to Ride the Service Bus",
				"content_html": "<p>One of the great things about adding new, senior talent to a storied team working on a large, complex, and <a title=\"CUNA Technology Council Gives Best of Show Award to Alkami\" href=\"https://www.alkamitech.com/cuna-best-of-show-award\" target=\"_blank\">successful</a> <a title=\"Alkami ORB Platform\" href=\"https://www.alkamitech.com/features/orb-platform\" target=\"_blank\">enterprise application solution</a> is the critical technical review that results in a lot of &ldquo;why did/didn&rsquo;t you do it this way?&rdquo; questions.  You have two options for responding to those questions - ignore or passively dismissing them, or taking the questions seriously as a challenge to prove out why you would make a decision you and your team made 5 years ago the same if you had to consider for the first time today, in today&rsquo;s frameworks, development methodologies, and the current team makeup and skills inventory.  If you choose to dismiss these opportunities to critically review your prior decisions, it says a lot about your management style, general appreciation of technology and response to its change, and positions your team to take a reactionary, defensive posture to architecture rather than create a team that honors a proactive, continuous improvement perspective.  Far more interesting too are those questions that ask why the system is architected in a general way, rather than a theological debate on whether a particular technology component choice is superior to all over or one&rsquo;s preferred/familiar choice.</p>\n<p>The particular question the new engineer asked was, &ldquo;Why aren&rsquo;t we using a <a title=\"Enterprise Service Bus\" href=\"https://en.wikipedia.org/wiki/Enterprise_service_bus\" target=\"_blank\">service bus</a>?&rdquo;  Instead of answering him directly, I figured this as a good opportunity to explore the previous decision we made that not only did not include an enterprise service bus (ESB) in the original design, but rejected its inclusion when it was strongly suggested by our first customer because they were standardizing on a service bus-centric architecture themselves.  The primary advantage of a service bus is to layer an abstraction across heterogeneous systems by implementing a centralized communication mechanism across components.  By applying this architectural model, you can get some key benefits including orchestration, queuing to handle intermittent component availability, and extensibility points for message routing to alter dispatch logic or transform messages.  Implementing the service bus pattern requires some kind of adapter to be written for each component of the system, either as a local modification to each component or by choosing to standardize on a communication channel provided by the ESB.  Even in the latter, usually some minor accommodation is required to allow the ESB to receive and encapsulate the native message for delivery to the destination component. Our first customer was a notable player in the community banking market, and was productizing multiple new SaaS-based web applications that depended on data feeds coming from many different customers.  In their scenarios, data was consumed by one application, parsed, and delivered to other applications, which in turn may have created additional data feeds for other products, in a cyclic communication/dependency non-directed graph.  Each application was developed by different teams, and there was no unified technology stack adoption - some teams were developing on EJB and Flex, others were pure .NET, and teams generally had the discretion to choose whatever they could argue would solve the job, without a strong technology leader looking to unify the stack for similar applications that delivered CMS and pseudo-online banking functionality using a common input data set.</p>\n<p>For this customer, ESB was a solution to a problem - their choices lead to a highly concurrent development process with multiple independent teams - but also supported connecting a heterogeneous environment of interdependent components, each of which accomplished limited objectives.  This organization was running red-hot - developing ancillary products to a highly engaged and fanatic client base of community banks, where their limiting factor was their speed of innovation and delivery.  By agreeing on a common communication mechanism that ESB could provide, there was something, albeit low-level, to which all teams agreed.  In the &lsquo;controlled agile chaos&rsquo; they found themselves in, the abstraction bought them flexibility to adapt changing business requirements using orchestration.  In theory anyway - they ended up moving much slower than they anticipated, but this wasn&rsquo;t the fault of ESB. ESB solves two classes of problems.  The first is the common use case of large, disparate enterprises looking to marry systems established from the dawn of client-server architectures to the newest Node.js hotness, without having to bend the will of any particular system to the communication conventions of any other, which may prove impossible if both systems are proprietary.  This is a common use case for <a title=\"Microsoft BizTalk\" href=\"http://www.microsoft.com/en-us/server-cloud/products/biztalk/default.aspx\" target=\"_blank\">BizTalk</a>, especially in the financial sector.  All the other benefits you can name off from a service bus architecture are really secondary advantages to this key objective.  The second is the use case that any layer of indirection provides: an abstraction you can use to increase the speed of development when requirements are incomplete or prone to <a href=\"https://en.wikipedia.org/wiki/Lean_Startup#Pivot\" target=\"_blank\">pivot</a>.  In each case, you invest in a layer to reduce the cost of future change. This particular customer chose <a title=\"NServiceBus\" href=\"http://particular.net/NServiceBus\" target=\"_blank\">NServiceBus</a> as their message-oriented middleware.  We seriously evaluated both the general architectural concepts ESB as well as the particular technology they suggested and came up with a definitive &lsquo;no&rsquo; to that choice.  While it made a lot of sense for our customer, it did not make sense for us because:</p>\n<ol>\n\t<li>\n<span style=\"text-decoration:underline;\">We did not require guaranteed event handling</span>.  Our system connected to a system of record that provided transactional consistency, and virtually all state changes were initiated by users through a web browser.  A timeout was preferable to queued command handling system because of the possibility of duplicate transactions that frustrated users may initiate, not realizing their requests were queued.  Second, our interconnected systems did not provide guaranteed event handling, so the guaranteed provided by the ESB would now be honored end-to-end.  Third, we are using the <a title=\"What is the Windows Identity Foundation?\" href=\"http://msdn.microsoft.com/en-us/library/ee748475.aspx\" target=\"_blank\">Windows Identity Foundation</a> with sliding time expirations end-to-end from the user's browser through the lowest layer of service components, which doesn't bode well for delayed delivery situations, even if the user was willing to wait.</li>\n\t<li>\n<span style=\"text-decoration:underline;\">We do require transformation, but not orchestration between our components</span>.  Our system features <a title=\"The Adapter Pattern\" href=\"http://www.oodesign.com/adapter-pattern.html\" target=\"_blank\">adapter-based design</a> to allow multiple types of endpoints to be serviced by a single service implementation for those portions that may need to connect to a different type of third-party system through a provider model implementation loaded by dependency injection.  We could have chosen to use ESB for this piece, however, we perceived the long-term maintenance cost of multiple providers with the party-specific transformation logic to be lower than maintaining those transforms in ESB scripting or adapters.  In reviewing this perception today, I believe it was still the right decision because is allowed for us to unit-test our transformation logic without including the ESB.</li>\n\t<li>\n<a title=\"Is an ESB a Single Point of Failure?\" href=\"http://www.middlewareguru.com/mw/?p=385\" target=\"_blank\">An ESB is a single point of failure</a> that would independently need to <a title=\"Is an ESB a Single Point of Failure?\" href=\"http://www.middlewareguru.com/mw/?p=385\" target=\"_blank\">scale for load</a> exponentially proportional to the number of service interconnects in our solution, and would add some amount of latency between each. Because online banking is a mission-critical, customer-facing solution, it cannot have SPOF's in any portion of the architectural design.  The SPOF nature of an ESB can be mitigated in multiple ways, but we felt that was at least two layers of complexity we could solve in other, simpler ways.</li>\n\t<li>All middleware increases the Mean Time Between Failures (<a title=\"Failure Rate\" href=\"https://en.wikipedia.org/wiki/Failure_rate\" target=\"_blank\">MTBF</a>).  This is not a risk specific to ESB, but of any layer added to a system.  If you add an ORM, IOC, ESB, or even a logging <a title=\"Aspect-Oriented Programming\" href=\"https://en.wikipedia.org/wiki/Aspect-oriented_programming\" target=\"_blank\">aspect</a>, something can go wrong with them.  Each component has some small, but measurable failure rate, and when inserted into the communication chain between all components, its reliability of 99.999% still contributes to a reduction in the overall reliability of a <a href=\"http://src.alionscience.com/pdf/S&amp;PSYSREL.pdf\" target=\"_blank\">serial system</a>.  This is where the <a href=\"https://en.wikipedia.org/wiki/KISS_principle\" target=\"_blank\">KISS principle</a> shines - complexity creates unreliability, so all complexity must generate a compelling benefit in excess of its potential to fail.</li>\n\t<li>\n<span style=\"text-decoration:underline;\">We wanted our application layer to be the platform, we did not want ESB to be the platform.</span>  This was a business case / competitive advantage decision that we wanted to build as a feature of our system that the same services layer that supported our front-end user interfaces was also an open and extensible platform upon which our clients could integrate to, which would increase the overall value proposition of online banking not only as a sticky end-user experience, but also as a value proposition to capitalize on our solution as the middleware that marries together all the disparate systems within a financial institution, which ultimately online banking does like no other piece of technology within a bank or credit union.  We felt that by positioning everything behind an ESB, the perceived value of our technology piece would be lessened without additional client education.</li>\n\t<li>MSMQ made us feel dirty enough, and we did not want to mandate it for each component because it was in 2009 and still is relatively difficult to debug, and lately we have learned, <span style=\"text-decoration:underline;\">queues do not work well with used with Layer 7 network load balancing</span>.  The new hotness of <a href=\"http://zeromq.org/\" target=\"_blank\">0MQ</a> wasn't around then, and while <a title=\"RabbitMQ\" href=\"http://www.rabbitmq.com/\" target=\"_blank\">RabbitMQ</a> was, it was arguably not production ready by that time.  For us, production-ready isn't just whether a component is capable, but whether it will have general acceptance from the IT departments of our large clients - many newer technologies that are FOSS or from vendors without an establish track record require a 'sale' and buy-in during due diligence, long before ink is applied to a contract.  Even if they were options for the ESB queuing mechanism, they would not resolve the larger aforementioned concerns.</li>\n\t<li>At the time we made this choice, <a title=\"Advanced Message Queuing Protocol\" href=\"https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol\" target=\"_blank\">AMQP</a> was an amorphous draft that did not solidify until later.  The lack of a vendor-independent protocol between components and an ESB made the <span style=\"text-decoration:underline;\">choice to utilize an ESB subject to vendor lock-in</span>, which we were not willing to tolerate for such a critical component.</li>\n\t<li>Because our product was both the end-user experience <em>and</em> the middleware we were writing, we felt strongly that <span style=\"text-decoration:underline;\">the application protocol should provide descriptive metadata and support fast client proxy generation</span> using .NET-based tools.  REST support was archaic at best (HttpRequest anyone?) in .NET 3.5, and to this day, consuming SOAP services is intrinsically more verbose in C# and VB.NET (HttpClient) than consuming REST or AMQP services due to a lack of better library and integrated language support for it.  Looking back on this, with a large amount of iterative change we went through from ideation to Version 1.0 of our solution, we could not have moved as fast without a fast way to regenerate proxies that would cause build failures to alert us of service operation signature changes -- tracking these down at runtime (REST) or having to debug a secondary system (ESB) to find these would have bogged down our delivery timelines.</li>\n\t<li>A lesser concern was we felt that tracing SOAP messages, while definitely more difficult than REST, would be more difficult debug any issues in AMQP or other ESB encapsulation protocols than inspecting SOAP envelopes with built-in WCF tools already present in the .NET development stack.</li>\n</ol>\nSo, that's quite a case against an ESB, but they do have compelling uses for certain environments - just not ours.  Like all technology selection decisions, it's important to pick the right tool for the job, and improve your tools as needed.  A standalone ESB would have provided significant benefits if we were developing with proprietary/closed third-party systems that were part of a call chain that required orchestration, or if we were developing with a heterogeneous mix of technologies.  In our case, we had a predictable homogeneous .NET environment based on web services, consumers of our API are our own technologies or a limited number of customers who were also using .NET, and we had no legacy baggage.  With the widespread adoption of WS-* standards, we have chosen to obtain some of the benefits, such as federation, from those standards rather than an ESB feature, which ultimately we believe makes our platform easier to support and distribute for our future API consumers.  Other side benefits such as logging are handled as separated concerns through dependency injection rather than external interceptors in a communication channel, a possibility for us only because we control the portion of the stack that requires orchestration.  And finally, by keeping <a title=\"Don’t use an ESB unless you absolutely, positively need one, Mule CTO warns\" href=\"http://www.zdnet.com/blog/gardner/dont-use-an-esb-unless-you-absolutely-positively-need-one-mule-cto-warns/3060\" target=\"_blank\">all communication as SOAP over HTTP/HTTPS</a>, we gain features like load balancing from Layer 7 network devices instead of an ESB process, which are much easier to switch out and upgrade.\n<p>The central design decision we made was that ESB&rsquo;s provide some great features and that ties you into an ESB, but if we could get those features another way that was just as convenient or more so, we&rsquo;d prefer the plug-and-play flexibility of leveraging existing solutions for components such as caching and load balancing in the environment our solution operates, or pick those pieces ad-hoc for those concerns rather than pick the best omnibus solution and work around any specific shortcomings for any one of them. In reviewing the current <a title=\"ESB is out, Enterprise Service Cloud is in\" href=\"http://www.zdnet.com/blog/service-oriented/enterprise-service-bus-is-out-enterprise-service-cloud-is-in/4950\" target=\"_blank\">industry literature</a> and <a title=\"To ESB or Not to ESB (a cautionary note written by an ESB vendor)\" href=\"http://blogs.mulesoft.org/to-esb-or-not-to-esb/\" target=\"_blank\">blog posts</a> and looking at <a title=\"Google Trends - Enterprise Service Bus\" href=\"http://www.google.com/trends/explore#q=enterprise%20service%20bus\" target=\"_blank\">general trends</a>, it would seem our decision not to marry our solution is generally the path many take when not required to integrate legacy systems as part of an orchestration chain or when using non-HTTP based transport mechanisms.  If you&rsquo;re using one, hopefully it&rsquo;s for a good and necessary reason!  For us, though, we decided not to hop on a service bus that could take us somewhere we already arrived.</p>\n<h6>* As an aside, we actually did end up rolling our own small \"ESB\" as a TCP port multiplexer that queues and portions out connectivity to a socket-based, <span style=\"line-height:1.5em;\">legacy third-party component that has no listener back-queue and no port concurrency, highly unusual for a server process.  Each connection consumes the port fully for the duration of the short transaction, and we had to write a way to buffer M number of requests and hand them off to (M-N) number of available ports as they became available,in a specialized type of </span><a style=\"line-height:1.5em;\" href=\"https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem\" target=\"_blank\">producer-consumer</a><span style=\"line-height:1.5em;\"> problem. In hindsight, this was an opportunity to use an ESB, but in our case, we only required message routing and load leveling, and in a few hundred lines of code, we implemented what we needed for this particular third-party system what would have taken us far longer to do as our first time using an ESB. That being said, should we encounter this with another vendor, it would make sense to review using an ESB for this type of functionality in the future.</span>\n</h6>\n",
				
				"date_published": "2014-04-02T04:08:02+00:00",
				"url": "https://blog.seanmcelroy.com/2014/04/02/when-to-ride-the-service.html",
				"tags": ["Programming"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2014/02/01/the-wires-cannot-be-trusted.html",
				"title": "The Wires Cannot Be Trusted; Does DRM Have Something to Teach Us?",
				"content_html": "<p>In the continuing revelations about the depth to which governments have gone to subjugate global communications in terms of privacy, anonymity, and security on the Internet, one thing is very clear: nothing can be trusted anymore.</p>\n<p>Before you wipe this post off as smacking of &lsquo;conspiracy theorist&rsquo;, take the Snowden revelations disclosed since Christmas, particularly regarding the NSA&rsquo;s Tailored Access Operations <a href=\"http://en.wikipedia.org/wiki/NSA_ANT_catalog\">catalog</a> that demonstrates the ways they can violate implicit trust in local hardware by <a href=\"http://arstechnica.com/information-technology/2013/12/inside-the-nsas-leaked-catalog-of-surveillance-magic/\">infecting firmware</a> at a level where even reboots and factory &lsquo;resets&rsquo; cannot remove the implanted malware, or their &ldquo;<a href=\"https://twitter.com/puellavulnerata/status/426597381727989760/photo/1\">interdiction</a>&rdquo; of new computers that allow them to install spyware between the time it leaves the factory and arrives at your house.  At a broader level, because of the trend in global data movement towards centralizing data transit through a diminishing number of top tier carriers - a trend is eerily similar to wealth inequality in the digital era - governments and pseudo-governmental bodies have found it trivial to exact control with quantum insert attacks.  In these sophisticated attacks, malicious entities (which I define for these purposes as those who exploit trust to gain illicit access to a protected system) like the NSA or GCHQ can slipstream rogue servers that mimic trusted public systems <a href=\"http://gigaom.com/2013/11/11/heres-how-british-intelligence-used-linkedin-and-slashdot-to-dupe-telecoms-workers/\">such as LinkedIn</a> to gain passwords and assume identities through ephemeral information gathering to attack other systems.</p>\n<p>Considering these things, the troubling realization is this is not the failure of the NSA, the GCHQ, the US presidential administration, or the lack of public outrage to demand change.  The failure is in the infrastructure of the Internet itself.  If anything, these violations of trust simply showcase technical flaws we have chosen not to acknowledge to this point in the larger system&rsquo;s architecture.  Endpoint encryption technologies like SSL became supplanted by forward versions of TLS because of underlying flaws not only in cipher strength, but in protocol assumptions that did not acknowledge all the ways in which the trust of a system or the interconnects between systems could be violated.  This is similarly true for BGP, which has seen a number of attacks that allow routers on the Internet to be reprogrammed to <a href=\"http://www.washingtonpost.com/blogs/the-switch/wp/2013/11/20/researchers-say-u-s-internet-traffic-was-re-routed-through-belarus-thats-a-problem/\">shunt traffic to malicious entities</a> that can intercept it: a protocol that trusts anything is vulnerable because nothing can be trusted forever.</p>\n<p>When I state nothing can be trusted, I mean absolutely nothing.  Your phone company definitely can&rsquo;t be trusted - they&rsquo;ve already been shown to have collapsed to government pressure to give up the keys to their part of the kingdom.  The very wires leading into your house can&rsquo;t be trusted, they could already or someday will be tapped.  Your air-gapped laptop can&rsquo;t be trusted, it&rsquo;s <a href=\"http://news.firedoglake.com/2014/01/15/nsa-using-radio-waves-to-hack-into-computers/\">being hacked with radio waves</a>.</p>\n<p>But, individual, private citizens are facing a challenge Hollywood has for years - how do we protect our content?  The entertainment industry has been chided for years on its sometimes Draconian attempts to limit use and restrict access to data by implementing encryption and hardware standards that run counter to the kind of free access analog storage mediums, like the VHS and cassette tapes of days of old, provided.  Perhaps there are lessons to be learned from their attempts to address the problem of &ldquo;everything, everybody, and every device is malicious, but we want to talk to everything, everybody, on every device&rdquo;.  One place to draw inspiration is <a href=\"http://en.wikipedia.org/wiki/High-bandwidth_Digital_Content_Protection\">HDCP</a>, a protocol most people except hardcore AV enthusiasts are unaware of that establishes device authentication and encryption across each connection of an HD entertainment system.  Who would have thought when your six year old watches Monsters, Inc., those colorful characters are protected by such an advanced scheme on the cord that just runs from your Blu-ray player to your TV?</p>\n<p>While you may not believe in DRM for your DVD&rsquo;s from a philosophical or fair-use rights perspective, consider the striking difference with this approach:  in the <a href=\"http://en.wikipedia.org/wiki/OSI_model\">OSI model</a>, encryption occurs at Layer 6, on top of many other layers in the system.  This is an implicit trust of all layers below it, and this is the assumption violated in the headlines from the Guardian and NY Times that have captured our attention the most lately: on the Internet, he who controls the media layers also controls the host layers.  In the HDCP model, the encryption happens more akin to Layer 2, as the protocol expects someone&rsquo;s going to splice a wire to try to bootleg HBO from their neighbor or illicitly pirate high-quality DVD&rsquo;s.  Today if I gained access to a server closet in a corporate office, there is nothing technologically preventing me from splicing myself into a network connection and copying every packet on the connection.  The data that is encrypted on Layer 6 will be very difficult for me to make sense of, but there will be plenty of data that is not encrypted that I can use for nefarious purposes: ARP broadcasts, SIP metadata, DNS replies, and all that insecure HTTP or poorly-secured HTTPS traffic.  Even worse, it&rsquo;s a jumping off point for setting up a MITM attack, such as an <a title=\"Thwarting SSL Inspection Proxies\" href=\"http://blog.seanmcelroy.com/2012/09/15/thwarting-ssl-inspection-proxies/\">SSL Inspection Proxy</a>.  Similarly, without media-layer security, savvy attackers with physical access to a server closet or the ability to coerce or hack into the next hop in the network path can go undetected if they redirect your traffic into rogue servers or into <a href=\"http://en.wikipedia.org/wiki/Utah_Data_Center\">malicious networks</a>, and because there is no chained endpoint authentication mechanism on the media-layer, there&rsquo;s no way for you to know.</p>\n<p>These concerns aren&rsquo;t just theoretical either, and they&rsquo;re not to protect teenagers' rights to anonymously author provocative and mildly threatening anarchist manifestos.  They&rsquo;re to protect your identity, your money, your family, and your security.  Only more will be accessible and controllable on the Internet going forward, and without appropriate protections in place, it won&rsquo;t just be governments soon who can utilize the assumptions of trust in the Internet&rsquo;s architecture and implementation for ill, but idealist hacker cabals, organized crime rings, and eventually, anyone with the right script kiddie program to exploit the vulnerabilities once better known and unaddressed.</p>\n<p>Why aren&rsquo;t we protecting financial information or credit card numbers with media-layer security so they&rsquo;are at least as safe as Mickey Mouse on your HDTV?</p>\n",
				
				"date_published": "2014-02-01T18:04:00+00:00",
				"url": "https://blog.seanmcelroy.com/2014/02/01/the-wires-cannot-be-trusted.html",
				"tags": ["Ethical Concerns","Privacy","Social Responsibility","Security"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2013/12/04/scaling-enterprise-databasebound-applications-io.html",
				"title": "Scaling Enterprise Database-Bound Applications: I/O",
				"content_html": "<h1>Optimizing Slow Accesses</h1>\nWhile most software developers like to think of themselves as computer scientists in the purest sense of the term, with job duties that would include intimately understanding and exploiting efficiencies of the x64 processor platform, optimizing that critical-path <a href=\"https://en.wikipedia.org/wiki/Big_O_notation\">O(log n)</a> algorithm to perform in O(log log n) time, and other acts of mathematical creativity and scientific application, that's not what most software developers do (or should be doing if they are).\n<p><span style=\"line-height:1.4;\">Most software developers are building business (retail B2C, B2B API&rsquo;s, or </span><a style=\"line-height:1.4;\" href=\"https://en.wikipedia.org/wiki/Line_of_business\">LOB</a><span style=\"line-height:1.4;\">&rsquo;s), not scientific applications &ndash; and that means most are developing I/O-bound, not CPU-bound applications.  Specifically, most business applications are creative user or application programming interfaces around relatively mundane </span><a style=\"line-height:1.4;\" href=\"https://en.wikipedia.org/wiki/Create,_read,_update_and_delete\">CRUD</a><span style=\"line-height:1.4;\"> operations on a data store.  Even more complex applications that perform data synchronization or novel calculations of </span>co-variance<span style=\"line-height:1.4;\"> or multivariate regression consume maybe 5% of their time crunching data, and the other 95% of the time retrieving and sending it on.</span></p>\n<p>So, when you design an enterprise application and get past the ideation phase and start scaling out your next-generation game-changing application from a cute demo to a serious and robust application serving millions of requests, why would you bother with refactoring your string concatenation in loops into <a href=\"http://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java\">string builders</a>, aiming for <a href=\"https://en.wikipedia.org/wiki/Zero-copy\">zero-copy</a>, or optimizing for CPU performance?  You should not and you should:  You should not be optimizing for CPU performance, unless you have optimized all your slow accesses away &ndash; and you should be optimizing for CPU performance because hopefully you&rsquo;ve already squeezed all the blood out of the I/O turnip you can.</p>\n<p>But you haven&rsquo;t.  I know you haven&rsquo;t.  You know you haven&rsquo;t if you are being honest.  Have you ever looked at your database queries per second for specific-entity queries?  For instance, let&rsquo;s say a user logs into your enterprise application, and a service on your application tier needs to retrieve the record of a user.  That service might call another service to make a record of the user&rsquo;s login.  Then the user navigates to another page in your application 60 seconds later.  How many times did any component of your system retrieve the user by their unique identifier?  If the answer is, &ldquo;I don&rsquo;t know&rdquo;, you haven&rsquo;t scratched the surface of scaling an enterprise application, much less my most important axiom of doing so: &ldquo;<span style=\"text-decoration:underline;\"><em><strong>Don&rsquo;t Repeat Requests</strong></em></span>&rdquo;.</p>\n<p>This is a lot harder than you might think, because enterprise web application development lends itself to repeating requests, and it is not an easy problem to solve, because you are essentially creating state on an application tier for a web tier that hosts a stateless HTTP application protocol.  When functionality is segregated into multiple services with distinct responsibilities, there is some duplication of I/O access that happens to fulfill a request that is unavoidable.  Unless you and everyone on your team completely understands this disjoint and works collectively to design solutions that do not repeat requests, you will repeat requests as part of the natural design of any system.</p>\n<h1>Caching Isn't a Magic Bullet, But It Is a Bullet</h1>\nIf you thought this post was going to end at \"implement <a href=\"http://www.javalobby.org/java/forums/t48846.html\">second-level caching</a> on your ORM of choice\", you're wrong, but you should be doing that for sure.  This is usually as easy installing a caching server like Couchbase, configuring your ORM in a few lines of code or configuration files, and wala - you are still repeating your requests, but this time, answering your repeated requests will be a lot faster than any SSD-backed database server will ever be.\n<p>(I say &lsquo;usually&rsquo;, because this depends on how you&rsquo;re using your ORM.  If you use your ORM as an expensive way to execute stored procedures, your ORM will be at best a pass-through for database methods and will not give you the benefit of entity caching that could be reused for multiple queries that include that entity as a result.  As with all caching, YMMV depending on how you have designed your layers.)</p>\n<p>Once you enable caching, <strong>measure</strong>.  Measure how many times you ask for that user record when a user logs in and performs some actions over time.  You&rsquo;ll be amazed that when you view this from a database request level, you will still be asking for the same user over and over again as long as not every component is using the cache for database entities with a consistent cache key.  It&rsquo;s very hard to get right, both from an application configuration and a caching server configuration perspective &ndash; do not assume, but do measure.</p>\n<p><span style=\"line-height:1.4;\">Remember, the most important thing to remember is not to get really fast answers to your repeated questions, but stop asking the same questions over and over again!  Caching at the ORM is your </span>tourniquet<span style=\"line-height:1.4;\"> to stop the bleeding of your performance into database I/O buffers and wait times, but caching at the inter-component request level is critical.  Let&rsquo;s say you have an enterprise web application that retrieves a forecast for a city for a given period of time.  The web client makes the request for the locale and date range to your application tier, which translates that into queries of whatever entities comprise your data model.  With ORM second-level caching in effect, the next request for the same locale and date range will not ask the question of the database this time, but the answer will come instead from the second-level cache&hellip; but stop right there.  The question was asked again at a higher level, you&rsquo;re just answering it in a more intelligent way the second time around.</span></p>\n<p>Enterprise web applications need to cache the responses of service requests using a cache key that accounts for the parameters of the request.  Hopefully your web application faithfully implements a <a href=\"http://msdn.microsoft.com/en-us/library/ff649690.aspx\">repository pattern</a>, and if so, you implement a cache into this layer to eliminate repeated requests to the service layer to start with. This is not easy.  This is hard because your ORM&rsquo;s database caching is likely a black box implementation of complex cache expiration logic that performs all sorts of clever tricks to know when an entity has become &lsquo;dirty&rsquo; and needs to be retrieved again from the underlying database rather than use the cached copy.  If you&rsquo;re developing business applications, you&rsquo;re probably not accustomed to being clever at this level, and you will need to spend the time to implement this manually throughout your repository pattern (unless you thought ahead and can add caching as an <a title=\"Aspect-Oriented Programming\" href=\"https://en.wikipedia.org/wiki/Aspect-oriented_programming\">aspect</a>) and to bust your caches.</p>\n<h2>Challenges of Busting Caches</h2>\n<span style=\"line-height:1.4;\">Busting your own caches - that is, invalidating a cached entry when you have reason to know the cached version is no longer good - is one of the trickiest things to get right in this stage of Don't Repeat Requests.  Let's take a service method called GetUser() that returns the user and an object graph of some interesting things that cover multiple data entities from the database.  At the web tier, we start caching that call when we make it so subsequent calls from the web tier won't even request this from the service while its in cache.  But what else could change the User object in the database?  If the user themselves can, then that's easy enough to know to bust a cache on a User repository .Save() method, but if other unrelated processes can, such as say, a back-end service process that bulk-updates users for some reason, then this gets more challenging to ensure you've identified all the paths that could invalidate the data and make sure each have access to bust the cache for the GetUser() response as cached by the web tier as well as the User entity as represented in any other request (think GetUser(), GetUsersByWhatever(), and all the other variants that may also need cache busting).  When GetUser() actually includes data sourced from other entities, you have to think about the dependent object graph in the data model and ensure you've accounted for these as well.  You just have to consider but not handle this </span>recursive<span style=\"line-height:1.4;\"> analysis for deep object graphs -- it only matters as much as it matters for the user experience.</span>\n<p>This kind of task must be reserved for the architects and most senior engineers who know your system design and inter-dependencies inside and out to avoid data consistency errors.  A key point is as long as all data validation logic is performed at the lowest layer under any custom caching work you perform, data consistency errors will at worst create a poor user experience.  If you don&rsquo;t - if you have critical client-side validation that is not mirrored under caching on the service-side of your architecture, you have bigger security risks and other problems than caching, but this will definitely impede your ability to deploy service request caching and scale your application.</p>\n<h1>Caching From Within</h1>\nWithin any area of your application, beware anti-patterns that repository patterns can create.  If you author MethodA() that calls MethodB() that calls MethodC(), all of which individually call UserRepository.GetUser(), then you're <span style=\"text-decoration:underline;\"><em>recursively</em></span> repeating yourself.  Repository patterns are nice because they reduce the repetitive session and connection management functions involved with making a web service or database call, but they make it easy to forget that they're very, very heavy methods.\n<p>Do not be afraid to accumulate.  Do not be afraid to pass object graphs through method parameters to save I/O.  You could think about the call stack as your cache here, and while you shouldn&rsquo;t load it up as an unnecessarily heavy omnibus object to pass around to any method, and while you definitely should not front-load all your I/O before calling a logical method chain before conditional logic or exception management could make some of the calls unnecessary, intelligently design methods so they don&rsquo;t take the smallest parameter set possible, but create the best scalability when working in concert.</p>\n<h1>Caching Outside Your Boundaries</h1>\nIf you're writing enterprise web applications for a product that is not dying or decaying, you're writing it in HTML5 today.  And if your web design isn't from a Frontpage 98 template, you're probably using AJAX requests either to improve user experiences and reduce perceived page load times or maybe you've gone whole-hog into an <a title=\"Single Page Application\" href=\"https://en.wikipedia.org/wiki/Single-page_application\">SPA</a> design.  With HTML5 and a relatively modern web browser, you have LocalStorage.  <strong>Use LocalStorage.</strong>\n<p>You should be using LocalStorage to cache and bust non-error responses to AJAX requests to your web services and REST endpoints. Just because you&rsquo;ve thinned out the pipes from services to the database and from the web tier to the services tier, why stop there?  Why continue to allow browsers to repeat requests to your web tier as a user moves back and forth between areas or pages?  If you rest on your laurels on a job-well-done, but still repeat unnecessary I/O queries at a level higher up in the chain, then you&rsquo;ve made your application more performant but not truly scalable &ndash; you&rsquo;ve just shifted the blame.</p>\n<h1>The F5 Test</h1>\nI propose what I will call the \"<strong>F5 Test</strong>\" for scalability.  When you've cached all you can cache, and every layer is implementing the \"Don't Repeat Requests\" mantra, open up your database profiler and your Couchbase cache hit dashboard.  Log into your application's dashboard, reporting, or whatever page you want to test, then clear your profiler and cache hit counters.  Press F5.  You should see very, very little activity on a reload, and you should be able to explain what you do see.\n<p>But, for what you do see, justify each and don&rsquo;t make excuses for yourself:</p>\n<ol>\n\t<li>If your dashboard makes repeated requests because you feel it \"always needs to be up-to-date\", then you're doing it wrong.  Cache and use <a title=\"event-stream\" href=\"https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events\">server-side events</a> to refresh your cached copy.</li>\n\t<li>If you load a user object to determine whether they have a login session, then do you have a good reason for not using browser evidence such as a signed <a href=\"https://en.wikipedia.org/wiki/SAML_2.0\">SAML assertion</a> to validate a session instead of using a database lookup to verify a user exists and is authorized?</li>\n\t<li>If you see something you can't explain, investigate.  I wish this was as obvious as it is intuitive, but many times software developers will be content with an arbitrary improvement (I made 232 database calls on login go down to 47) rather than to do the homework to find out why 47 isn't 5.  Maybe there are 42 extraneous requests made by a service that doesn't use the cache even though you thought it did.  Maybe one of those 42 requests causes database locking escalations that won't scale with load.</li>\n</ol>\n<span style=\"font-size:20px;line-height:1.5em;\">Optimizing Query Plans</span>\n<p>Oh yeah, and optimize query plans.  This is important work, but it&rsquo;s not the outer-most layer of the onion.  It&rsquo;s important to remember the difference between scalability and performance:</p>\n<ul>\n\t<li>Performance should be determined by the user experience from dispatching of the request to final rendering of the result to the user in their browser.  Performance is not \"how much CPU does the system use under load\" - that is resource utilization, though many people use performance for both concepts.</li>\n\t<li>Scalability is two-fold: How many users can I get a certain level performance on a certain hardware basline (scaling up), and can I and how often will I have to throw money at more hardware to handle more users at the same level of performance (scaling out)?</li>\n\t<li>Improving performance may or may not improve scalability</li>\n\t<li>Improving scalability rarely improves performance</li>\n\t<li>Management will not understand the difference</li>\n</ul>\nOptimizing query plans can impact both: improving a query plan from 6 seconds to 1 second improves performance.  It could improve scalability if your queries are over complex joins or large data sets that couldn't be pinned in memory automagically in your database server.  But optimizing query plans for speed alone is not a function of scalability -- optimizing them for I/O is where it's at.  Simple improvements like changing JOIN's to EXISTS's where feasible allow the query engine to skip unnecessary I/O is what opens up buffers and improves throughput through the disk subsystems where the big performance and scalability penalties hit.  It just so happens complex queries that have I/O in intermediate steps also have high CPU due to hash matching, rewinds, and other operations that perform calculations on large amounts of data generated from unnecessary I/O.\n<p><span style=\"line-height:1.4;\">It&rsquo;s work you should do, but you shouldn&rsquo;t do it first for scalability reasons.</span></p>\n<h1><span style=\"line-height:1.4;\">After-Thoughts: Don't Report Stupid Results</span></h1>\nBuilding highly-scalable applications from the ground up with a large team is impossible.  You iterate scalability just as you iterate product features.  Actually, hopefully you iterate scalability tasks along with user stories, but in actuality, complex enterprise web applications are usually architected with the best of intentions with intelligent designs, but reach a breaking point at some level of load on some hardware platform that cause a stop-drop-and-roll effort to improve the scaling up and out of an application.  Companies with deadlines and tight deliverable schedules don't consistently evaluate and factor the required work to make and keep an application scalable over time into iterations.  If someone tells you differently, they're probably in sales and they're definitely lying.\n<p>That being said, software developers, do not succumb to the pressure to deliver scalability improvements by reporting true but irrelevant statistics to management.</p>\n<ul>\n\t<li>\"I sped up database calls for GetUser() by 300%!\" suggests anything that gets a user should see a three-fold improvement in speed.  If that database call is 1% of the login process time, then it will have no material impact.</li>\n\t<li>\"I reduced the size of page requests from 500K to 250K!\" means \"I doubled the performance or scalability of the application\" to management, but in reality, it means neither.</li>\n\t<li>\"I found a problem between ServiceA and ServiceB and cut out three extraneous calls between them!\" means nothing to anyone.  Did you remove three calls that are made once an hour by a batch process, or three calls made for every user login?  What was the impact of those calls on performance and scalability before and after the optimization?</li>\n\t<li>\"ServiceA is a big problem and has a lot of errors.  I removed a lot of exceptions on ServiceA.  Exceptions cause performance problems.\" is problematic on several levels.  Why were the exceptions being thrown?  Did removing them fix or just sweep a real problem under the carpet?  If it was justified, what improvement did it have on the overall system?</li>\n</ul>\nWhen software developers communicate their changes, it implies they have meaningful impact. However, many software developers fail to measure the before and after impact of their changes on the whole system, but typically only evaluate them in the microcosm of the area they changed.  This is about as useful as management suggesting areas they should fix based on intuition or high-level reporting tools.\n<p>While most devs don&rsquo;t do scientific computing, scaling applications is an empirical task that demands meaningful measurement in a realistic testing context.  There is spec document or product owner guidance on improving scalability: you must treat it as a scientific experiment.  Observe, hypothesize, have a control (the pre-change measurement), experiment, report data.  If you fail to discretely value each change with before and after metrics, you&rsquo;re just shooting in the dark.  Cowboy coding gets teams into scalability messes, not out of them.</p>\n<p>Especially, though, don&rsquo;t give updates on enhancements that you cannot verify improve scalability with before and after numbers.  If you fix a problem that doesn&rsquo;t improve the overall system scalability, which happens often in scalability improvement iterations, highlighting your accomplishments when there is no observable improvement suggest you are either ineffective or not working on the right items.  Worse, in crunch times, providing such updates gives a false sense of accomplishment to management.  Improving scalability, or performance for that matter, has no done-state.  But providing meaningless accomplishment notes to management will accelerate the sense of &ldquo;we&rsquo;re done enough&rdquo;, when in fact, you may not have even identified the most significant issue to your scalability for your particular scenario.</p>\n<p>And if you haven&rsquo;t, let me do it for you:  You&rsquo;re repeating your requests.  Trust me on that one. :-)</p>\n",
				
				"date_published": "2013-12-04T23:49:32+00:00",
				"url": "https://blog.seanmcelroy.com/2013/12/04/scaling-enterprise-databasebound-applications-io.html",
				"tags": ["Programming"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2013/08/22/a-brief-introduction-to-partofspeech.html",
				"title": "A Brief Introduction to Part-of-Speech Tagging",
				"content_html": "<p>A field of computer science that has captured my attention lately is <a href=\"http://en.wikipedia.org/wiki/Computational_linguistics\">computational linguistics</a> &ndash; the inexact science of how to get a computer to understand what you mean.  This could be something as futuristic as Matthew Broderick&rsquo;s battle with the <a href=\"http://en.wikipedia.org/wiki/WarGames\">WOPR</a>, or with something more practical, like Siri.  Whether it be text entered by a human into a keyboard or something more akin to understanding the very unstructured format of <a href=\"http://en.wikipedia.org/wiki/Speech_disfluency\">human speech</a>, understanding the meaning behind parsed words is incredibly complex &ndash; and to someone like me &ndash; fascinating!</p>\n<p>My particular interest as of late is parsing &ndash; which from a linguistic perspective, means the breaking down of a string of characters into words, their meanings, and <a href=\"http://en.wikipedia.org/wiki/Semantic_analysis_(computer_science)#Front_end\">stringing them together</a> in a parse tree, where the meanings of individual words as well as the relationships between words is composed into a logical construct that allows higher order functions, such as a <a href=\"http://en.wikipedia.org/wiki/CALO\">personal assistant</a>.  Having taken several foreign language classes before, then sitting on the other side of the table as an ESL teacher, I can appreciate the enormous ambiguity and complexity of any language, and much more so English among Germanic languages, as to creating an automated process to parse input into meaningful logical representations.  Just being able to discern the meaning of individual words given the multitude of meanings that can be ascribed to any one sequence of characters is quite a challenge.</p>\n<h1>Parsing Models</h1>\n<span style=\"font-size:13px;line-height:1.4;\">Consider this:  </span><em>My security beat wore me out tonight.</em>\n<p>In this sentence, what is the function of the word beat?  Beat functions as either a noun or a verb, but in this context, it is a noun.  There are two general schools of thought around assigning a tag as to what part of speech (POS) each word in a sentence functions as &ndash; iterative rules-based methods and stochastic methods.  In rules-based methods, like <a href=\"http://en.wikipedia.org/wiki/Brill_tagger\">Eric Brill&rsquo;s</a> POS tagger, a priority-based set of rules that set forth language-specific axioms, such as &ldquo;when a word appears to be a preposition, it is actually a noun if the preceding word is while&rdquo;.  A complex set of these meticulously constructed conditions is used to refine a more course dictionary-style assignment of POS tags.</p>\n<p style=\"text-align:center;\"><img class=\"aligncenter\" alt=\"\" src=\"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcStvRWQ3l-YirN4mQlTuG1erCEKL9Usu67Ii2A1CAX_DVGCdFuYqg\" width=\"281\" height=\"179\"></p>\nStochastic methods, however, are more \"fuzzy\" methods of building advanced statistical models of how words should be tagged not based on a procedural and manual analysis of edge cases and their mitigations, but using training models over pre-tagged <a href=\"http://en.wikipedia.org/wiki/Text_corpus\">corpra</a>, in a manner hearkening to the training sets applied to neural networks.  These trained models are then used as a baseline for assigning tags to incoming text, but no notable option for correction of any specific error or edge case other than retraining the entire model is available for refinement.  One such very interesting concept is treating the tagging of parts of speech as <a href=\"http://www.cs.sjsu.edu/~stamp/RUA/HMM.pdf\">Hidden Markov Models</a>, which is a probabilistic model that strives to explain how a process with a defined pattern that is not known other than sparse characteristics of the model and the inputs and the outputs through the process.\n<img class=\"aligncenter\" alt=\"\" src=\"https://seanmcelroy.micro.blog/uploads/2026/381cd991de.jpg\" width=\"450\" height=\"222\">\n<p>This continues to be a good candidate for doctorial theses in computer science disciplines.. papers that have caused me to lose too much sleep as of late.</p>\n<h1>Parsing Syntax</h1>\nEven describing parts of speech can be as mundane as your elementary school grammar book, or as rich as the <a href=\"http://ucrel.lancs.ac.uk/claws/\">C7 tagset</a>, which provides 146 unique ways to describe a word's potential function.  While exceptionally expressive and specific, I have become rather fond of the <a href=\"http://bulba.sdsu.edu/jeanette/thesis/PennTags.html\">Penn Treebank II tagset</a>, which defines 45 tags that seem to provide enough semantic context for the key elements of local pronoun resolution and larger-scale object-entity context mapping.  Finding an extensively tagged Penn Treebank corpus proves difficult, however, as it is copyright by the University of Pennsylvania, distributed through a public-private partnership for several thousand dollars, and the tagged corpus is almost exclusively a narrow variety of topics and sentence structures -- Wall Street Journal articles.  Obtaining this is critical to use as a reference check for writing a new Penn Treebank II part-of-speech tagger, and it prevents the construction of a more comprehensive Penn-tagged wordlist, which would be a boon for any tagger implementation.  However, the folks at the <a href=\"http://nltk.org/\">NLTK</a> has provided a 10% free sample under Fair Use that has provided somewhat useful for both checking outputs in a limited fashion, but also for generating some more useful relative statistics about relationships between parts of speech within a sentence.\n<p style=\"text-align:center;\"><img class=\"aligncenter\" alt=\"\" src=\"http://www.linguistik-online.de/50_11/eckerPict/eckerPict29.png\" width=\"480\" height=\"138\"></p>\nTo produce some rudimentary probabilistic models to guide ambiguous POS-mappings for individual words, I wrote a five-minute proof of concept that scanned the NLTK-provided excerpt of the WSJ Penn Treebranch corpus to produce probabilities of what the next word's part of speech would be given the previous word's tag. The full results are available in <a href=\"https://gist.github.com/seanmcelroy/6303318\">this gist</a>.\n<h1>Future Musings</h1>\nMy immediate interest, whenever I get some free time on a weekend (which is pretty rare these days due to the exceptional pace of progress at our start-up), is pronoun resolution, which is the object of this generation's <a href=\"http://www.loebner.net/Prizef/loebner-prize.html\">Turing Test</a> -- the <a href=\"http://www.newyorker.com/online/blogs/elements/2013/08/why-cant-my-computer-understand-me.html\">Winograd Schemas</a>.  An example of such a challenge is to get a machine to answer this kind of question -- <em>Joe's uncle can still beat him at tennis, even though he is 30 years older. Who is older?</em> This kind of question is easy for a human to answer, but very, very hard for a machine to infer because (a) it can't cheat to Google a suitable answer, which some of the less impressive Turing Test contestant programs now do, and (b) it requires not only the ability to successfully parse a sentence into its respective parts of speech, phrases, and clauses, but it requires the ability for a computer to resolve the meaning of a pronoun.  That's an <span style=\"text-decoration:underline;\">insanely</span> tough feat!  Imagine this:\n<p>&ldquo;Annabelle is a mean-spirited person.  She shot my dog out of spite.&rdquo;</p>\n<p>A program could infer &ldquo;my dog&rdquo; is a dog belonging to the person providing the text.  This has obvious applications in the real world if you can do this, and it <a href=\"http://technet.microsoft.com/en-us/library/aa198281(v=sql.80).aspx\">has been done before</a>.  But, imagine the leap in context that is exponentially harder to overcome when resolving &ldquo;She&rdquo;.  This requires not only an intra-sentence relationship of noun phrases, possessive pronouns, direct objects, and adverbial clauses, but it also requires the ability to carry context forward from one sentence to the next, building a going &ldquo;mental map&rdquo; of people, places, things &ndash; and building a profile of them as more information or context is provided.  And, if you think that&rsquo;s not hard enough to define .. imagine the two additional words appended on to this sentence:</p>\n<p><span style=\"font-size:13px;line-height:1.4;\">, she said.</span></p>\n<p>That would to a human indicate dialog, which requires a wholly separate frame of Inception-style reference between contextual frames.  The parser is reading text about things which is actually being conveyed by other things &ndash; both sets of frames have their own unique, but not necessarily separate, domains and attributes.  I&rsquo;m a very long-way off from ever getting this diversion in my &ldquo;free time&rdquo; anywhere close to functioning as advertised&hellip; but, then again, that&rsquo;s what exercises on a weekend are for &ndash; not doing, but learning. :)</p>\n",
				
				"date_published": "2013-08-22T05:02:09+00:00",
				"url": "https://blog.seanmcelroy.com/2013/08/22/a-brief-introduction-to-partofspeech.html",
				"tags": ["Programming"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2013/08/07/robustness-in-programming.html",
				"title": "Robustness in Programming",
				"content_html": "<p>(For my regular readers, I know I promised this post would detail &lsquo;a method by which anyone could send me a message securely, without knowing anything else about me other than my e-mail address, in a way I could read online or my mobile device, in a way that no one can subpoena or snoop on in between.&rsquo;  A tall order, for sure, but still something I am working to complete in an RFC format.  In the meantime&hellip;)</p>\n<p>I have the benefit of supporting an engineering group that is seeing tremendous change and growth well past ideation and proof of concept, but at the validation and scaling phases of a product timeline.  One observation I&rsquo;ve made about the many lessons taught and learned as part of this company and product growth spurt have been the misapplication of the Jon Postel&rsquo;s <a href=\"https://en.wikipedia.org/wiki/Robustness_principle\" target=\"_blank\">Robustness Principle</a>.  Many technical folks are at least familiar with, but often can quote the adage: &ldquo;<i>Be conservative in what you do, be liberal in what you accept from others</i>&rdquo;.  Unfortunately, like many good pieces of advice, this is taken out of context when it relates to software development.</p>\n<p>First off, robustness, while it sounds positive, it not a trait you always want.  This can be confusing for the uninitiated, considering antonyms of the word include &ldquo;unfitness&rdquo; and &ldquo;weakness&rdquo;.  On a macro-scale, you want a system to be robust; you a product to be robust.  However, if you decompose an enterprise software solution into its components, and those pieces into their individual parts, the <a href=\"https://en.wikipedia.org/wiki/Concern_(computer_science)\" target=\"_blank\">concerns</a> do not always need to, and in some cases should not, be robust.</p>\n<p>For instance, should a security audit log be robust?  Imagine a highly secure software application that must carefully log each access attempt to the system.  This system is probably designed so that many different components of the system can write data to this log, and imagine the logging system is simple and writes its output to a file.  If this particular part of the system were robust, as many developers define it, it must, as well as possible, attempt to accept and log any messages posted to it.  However, implemented this way, it is subject to <a href=\"https://www.veracode.com/security/crlf-injection\" target=\"_blank\">CRLF attacks</a>, whereby a component that can connect to it and insert a delimiter that would allow it to add false entries to the security log.  Of course, you developers say, you need to do input checking and not allow such a condition to pass through to the log.  I would go much further and state you must be as meticulous as possible about parsing and throwing exceptions or raising errors for as many conditions as possible.  Each exception that is not thrown is an implicit assumption, and assumptions are the root cause of 9 out the <a href=\"https://www.owasp.org/index.php/Top_10_2013-Top_10\" target=\"_blank\">OWASP Top 10</a> vulnerabilities in web applications.</p>\n<p>Robustness can, and is often, an excuse predicated by laziness.  Thinking about edge cases and about the assumptions software developers make with each method they write is tedious.  It is time consuming.  It does not advance a user story along its path in an iteration.  It adds no movement towards delivering functionality to your end users.  <strong>Recognizing and mitigating your incorrect assumptions, however, is an undocumented but critical requirement for the development of every piece of a system that does store, or may ever come in contact with, protected information</strong>.  Those that rely on the Robustness Principle must not interpret &ldquo;liberal&rdquo; to mean &ldquo;passive&rdquo; or &ldquo;permissive&rdquo;, but rather &ldquo;extensible&rdquo;.</p>\n<p>In the previous example I posited about a example logging system, consider how such a system could remove assumptions but still be extensible.  The number and format of each argument that comprises a log entry should be carefully inspected - if auditing text must be descriptive, then shouldn&rsquo;t such a system reject a zero or two-character event description?  While information systems should be localizable and multilingual, shouldn&rsquo;t all logs be written in one language and any characters that are not of that language omitted and unique system identifiers within the log languages' character set used instead?  If various elements are co-related, such as an account number and a username, shouldn&rsquo;t they be checked for an association instead of blindly accepting them as stated by the caller?  If the log should be chronological, shouldn&rsquo;t an event specified in the future or too far in the past be rejected?  Each of these leading questions exposes a vulnerability a careful assessment of input checking can address, but which is wholly against most developers' interpretations of the Robustness Principle.</p>\n<p>However, robustness is not about taking whatever is given to you, it is about very carefully checking what you get, and if and only if it passes a litany of qualifying checks, accepting it as an answer to an open-ended question, rather than relying on a defined set of responses, when possible.  A junior developer might enumerate all the error states he or she can imagine in a set list or &ldquo;enum&rdquo;, and only accept that value as valid input to a method.  While that&rsquo;s a form of input checking, it is wholly inextensible, as the next error state any other contributor wishes to add will require a recompile/redeploy of the logging piece, and potentially every other consumer of that component.  <strong>Robustness need not require all data be free-form, it must simply be written with foresight.</strong></p>\n<p>Postel, wrote his &ldquo;law&rdquo; with reference to <a href=\"https://tools.ietf.org/html/rfc761\" target=\"_blank\">TCP implementations</a>, but he never suggested that TCP stack implementers <em>liberally</em> accept TCP segments with such boundless blitheness that they infer the syntax of whatever bits they received, but rather, they should not impose an understanding of the data elements that were not pertinent to the task at hand, nor enforce one specific interpretation of a specification upon upstream callers.  And therein lies my second point &ndash; robustness is not about disregarding syntax, but about imposing a convention.  Robust systems must fail as early and as quickly as possible when syntax, especially, has been violated or cannot be accurately and unambiguously interpreted, or if the context or state of a system is deemed to be invalid for the operation.  For instance, if a receives a syntactically valid message but can determine the context is wrong, such as a request for information from a user who lacks an authorization to that data, every conceivable permutation of invalid context should be checked, not fail to consider each in a blasé fashion to leave room for a future feature that may, someday, require an assumption made in the present, if it is ever to be developed.  This crosses another threshold beyond extensibility to culpable disregard.</p>\n<p>In conclusion, building a robust system requires discretion in interpretation of programming &ldquo;laws&rdquo; and &ldquo;axioms&rdquo;, and an expert realization that no one-liner assertions were meant by their authors as principles so general to apply to every level of technical scale of the architecture and design of a system.  To those who would disagree with me, I would say, then to be &ldquo;robust&rdquo; yourself, you have to accept my argument. ;)</p>\n",
				
				"date_published": "2013-08-07T23:43:45+00:00",
				"url": "https://blog.seanmcelroy.com/2013/08/07/robustness-in-programming.html",
				"tags": ["Programming"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2013/06/20/when-all-you-see-are.html",
				"title": "When All You See Are Clouds... A Storm Is Brewing",
				"content_html": "<p><img class=\"alignright\" style=\"line-height:1.4;\" alt=\"\" src=\"http://msnbcmedia.msn.com/j/MSNBC/Components/Photo/_new/130606-NSA-headquarters-tight-730a.380;380;7;70;0.jpg\" width=\"304\" height=\"228\">The recent disclosures that the United States Government <a href=\"http://www.policymic.com/articles/11689/nsa-surveillance-violates-fourth-amendment-and-right-to-privacy\" target=\"_blank\">has violated</a> the 4th amendment of the U. S. Constitution and potentially other international law by building a clandestine program that provides G-Men at the NSA direct taps into every aspect of our digital life - our e-mail, our photos, our phone calls, our entire relationships with other people and even with our spouses, is quite concerning from a technology policy perspective.  The fact that the US Government (USG) can by legal authority usurp any part of our recorded life - which is about every moment of our day - highlights several important points to consider:</p>\n<ol>\n\t<li>Putting the issue of whether the USG/NSA <em>should</em> have broad access into our lives aside, we must accept that the loopholes that allow them to demand this access <em>expose</em> weaknesses in our technology.</li>\n\t<li>The fact the USG can perform this type of surveillance indicates other foreign governments and non-government organizations likely can and may already be doing so as well.</li>\n\t<li>Given that governments are often less technologically savvy though much more resource-rich than malevolent actors, if data is not secure from government access, is it most definitely not secure from more cunning hackers, identity thieves, and other criminal enterprises.</li>\n</ol>\nIf we can accept the points above, then we must accept that the disclosure of PRISM and connotation through carefully but awkwardly worded public statements about the program present both a problem and an opportunity for technologists to solve regarding data security in today's age.  This is not a debate of <a href=\"http://docs.law.gwu.edu/facweb/dsolove/Nothing-to-Hide/index.html\">whether we have anything to hide</a>, but rather a discussion of how can we secure data, because if we cannot secure it from a coercive power (sovereign or criminal), we have no real data security at all.\n<p><span style=\"line-height:1.4;\">But before proposing some solutions, we must consider:</span></p>\n<h2>How Could PRISM Have Happened in the First Place?</h2>\n<img class=\"alignright\" alt=\"\" src=\"http://www.blogcdn.com/www.engadget.com/media/2009/05/090527-300baud-01.jpg\" width=\"269\" height=\"179\">\n<p>I posit an answer devoid of politics or blame, but on an evaluation of the present state of Internet connectivity and e-commerce.  Arguably, the Internet has matured into a stable, reliable set of services.  The more exciting phase of its development saw a flourishing of ideas much like a digital <a href=\"https://en.wikipedia.org/wiki/Cambrian_explosion\" target=\"_blank\">Cambrian explosion</a>.  In its awkward adolescence, connecting to the Internet was akin to performing a complicated rain dance that involved <a href=\"http://thanksfortrumpetwinsock.com/\">WinSock</a>, dial-up modems, and PPP, sprinkled with roadblocks like busy signals, routine server downtime, and blue screens of death.  The rate of change in equipment, protocols, and software was meteoric, and while the World Wide Web existed (what most laypeople consider wholly as &ldquo;the Internet&rdquo; today), it was only a small fraction of the myriad of services and channels for information to flow.  Connecting to and using the Internet required highly specialized knowledge, which both increased the level of expertise of those developing for and consuming the Internet, while limiting its adoption and appeal - a fact some consider the net&rsquo;s <a href=\"http://www.pcmag.com/article2/0,2817,1977810,00.asp\" target=\"_blank\">Golden Age</a>.</p>\n<p>But as with all complex technologies, eventually they mature.  The rate of innovation slows down as standardization becomes the driving technological force, pushed by market forces.  As less popular protocols and methods of exchanging information give way to young but profitable enterprises that push preferred technologies, the Internet became a much more homogeneous experience both in how we connect to and interact with it.  This shapes not only the fate of now-obsolete tech, such as <a href=\"https://en.wikipedia.org/wiki/UUCP\" target=\"_blank\">UUCP</a>, FINGER, ARCHIE, GOPHER, and a slew of other relics of our digital past, but also influenced the very design of what remains &ndash; a great example being identification and encryption.</p>\n<p>For the Internet to become a commercializable venue, securing access to money, from online banking to investment portfolio management, to payments, was an essential hurdle to overcome.  The solution for the general problem of identity and encryption, centralized SSL certificate authorities providing assurances of trust in a top-down manner, solves the problem specifically for central server webmasters, but not for end-users wishing to enjoy the same access to identity management and encryption technology.  So while the beneficiaries like Amazon, eBay, PayPal, and company now had a solution that provided assurance to their users that you could trust their websites belonged to them and that data you exchanged with them was secure, end-users were still left with no ability to control secure communications or identify themselves with each other.</p>\n<p><img class=\"alignright\" alt=\"\" src=\"http://www.naturalnews.com/gallery/articles/NSA-tech-companies-spy-scandal.jpg\" width=\"300\" height=\"200\">A final contributing factor I want to point out is that other protocols drifted into oblivion, more functionality was demanded over a more uniform channel &ndash; the de facto winner becoming HTTP and the web.  Originally a stateless protocol designed for minimal browsing features, the web became a solution for virtually everything, from e-mail (&ldquo;webmail&rdquo;), to searching, to file storage (who has even fired up an FTP client in the last year?).  This was a big win for service providers, as they, like Yahoo! and later Google, could build entire product suites on just one delivery platform, HTTP, but it was also a big win for consumers, who could throw away all their odd little programs that performed specific tasks, and could just use their web browser for everything &ndash; now even Grandma can get involved.  A more rich offering of single-shot tech companies were bought up or died out <a href=\"http://danmccurry.wordpress.com/2012/12/19/the-oligarchs-of-the-internet/\" target=\"_blank\">in favor of the oligarchs</a> we know today - Microsoft, Facebook, Google, Twitter, and the like.</p>\n<p>Subtly, this also represented a huge shift on where data is stored.  Remember Eudora or your Outlook inbox file tied to your computer (in the days of POP3 before IMAP was around)?  As our web browser became our interface to the online world, and as we demanded anywhere-accessibility to those services and they data they create or consume, those bits moved off our hard drives and into the nebulous service provider cloud, where data security cannot be guarenteed.</p>\n<p>This is meaningful to consider in the context of today&rsquo;s problem because:</p>\n<ol>\n\t<li>Governments and corporate enterprises were historically unable to sufficiently regulate, censor, or monitor the internet because they lacked the tools and knowledge to do so.  Thus, the Internet had security through obscurity.</li>\n\t<li>Due to the solutions to general problems around identity and encryption <a href=\"https://cyber.law.harvard.edu/events/2012/09/vaneijk_arnbak\" target=\"_blank\">relying on central authorities</a>,  malefactors (unscrupulous governments and hackers alike) have fewer targets to influence or assert control over to tap into the nature of trust, identity, and communications.</li>\n\t<li>With the collapse of service providers into a handful of powerful actors on a scale of inequity on par with a collapse of wealth distribution in America, there exist now fewer providers to surveille to gather data, and those providers host more data on each person or business that can be interrelated in a more meaningful way.</li>\n\t<li>As information infrastructure technology has matured to provide virtual servers and IaaS offerings on a massive scale, <a href=\"http://www.bloomberg.com/news/2013-03-26/security-fears-give-way-to-economics-as-cloud-computing-grows.html\">fewer users and companies deploy controlled devices and servers</a>, opting instead to lease services from cloud providers or use devices, like smartphones, that wholly depend upon them.</li>\n\t<li>Because data has migrated off our local storage devices to the cloud, end-users have lost control over their data's security.  Users have to choose between an outmoded device-specific way to access their data, or give up the control to cloud service providers.</li>\n</ol>\n<h2>There Is A Better Way</h2>\n<img class=\"alignright\" alt=\"\" src=\"http://actualdownload.com/pictures/icon/encryption-shield-57903.jpg\" width=\"210\" height=\"210\">Over the next few blog posts, I am going to delve into a number of proposals and thoughts around giving control and security assurances of data back to end-users.  These will address points #2 and #4 above as solutions that layer over existing web technologies, not proposals to upend our fundamental usage of the Internet by introducing opaque configuration barriers or whole-new paradigms.  End-users should have choice whether their service providers have access to their data in a way that does not require Freenet's <a href=\"https://en.wikipedia.org/wiki/Darknet_(file_sharing)\" target=\"_blank\">darknets</a> or Tor's game-of-telephone style of anonymous but slow <a href=\"https://en.wikipedia.org/wiki/Onion_Routing\" target=\"_blank\">onion-routing</a> answer to web browsing.  Rather, users should be able to positively identify themselves to the world and be able to access and receive data and access it in a cloud-based application without ever having to give up their data security, not have to trust of the service provider, be independent to access the data on any devices (access the same service securely anywhere), and not have to establish shared secrets (swap passwords or certificates).\n<p>As a good example, if you want to send a secure e-mail message today, you have three categorical options to do so:</p>\n<ol>\n\t<li>\n<strong>Implicitly trust a regular service provider</strong>:  Ensure both the sender and the receiver use the same server.  By sending a message, it is only at risk while the sender connects to the provider to store it and while the receiver connects the provider to retrieve it.  Both parties trust the service provider will not access or share the information.  Of course, many actors, like Gmail, <a href=\"http://www.dailymail.co.uk/sciencetech/article-2275739/Microsoft-lays-Google-invading-Gmail-users-privacy-scanning-contents-emails-target-personalised-adverts.html\" target=\"_blank\">still do</a>.</li>\n\t<li>\n<strong>Use a secure webmail provider</strong>:  These providers, like Voltage.com, encrypt the sender's connection to the service to protect the message as it is sent, and send notifications to receivers to come to a secure HTTPS site to view the message.  While better than the first option, the message is still stored in a way that can be demanded by subpoena or snooped inside the company while it sits on their servers.</li>\n\t<li>\n<strong>Use S/MIME certificates and an offline mail client</strong>:  While the most secure option for end-to-end message encryption, this cumbersome method is machine-dependent and requires senders and receivers to first share a certificate with each other - something the average user is flatly incapable of understanding or configuring.</li>\n</ol>\nStay tuned to my next post, where I propose a method by which anyone could send me a message securely, without knowing anything else about me other than my e-mail address, in a way I could read online or my mobile device, in a way that no one can subpoena or snoop on in between.\n<p> </p>\n",
				
				"date_published": "2013-06-20T22:06:05+00:00",
				"url": "https://blog.seanmcelroy.com/2013/06/20/when-all-you-see-are.html",
				"tags": ["Ethical Concerns","Privacy","Security"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2013/05/29/doing-your-due-diligence-on.html",
				"title": "Doing Your Due Diligence on Security Scanning and Penetration Testing Vendors",
				"content_html": "<p>All too often, development shops and IT professionals become complacent with depending on packaged scanning solutions or a utility belt of tools to provide security assurance testing of a hosted software solution.  In the past five years, a number of new entrants to the security evaluation and penetration testing market have created some compelling cloud-based solutions to perimeter testing.  These tools, while exceptionally useful for a sanity check of firewall rules, load balancer configurations, and even certain industry best practices in web application development, are starting to create a false sense of security in a number of ways.  As these tools proliferate, infrastructure professionals are becoming increasingly dependent upon their handsomely-crafted reporting about PCI, GLBA, SOX, HIPPA, and all the other regulatory buzzwords that apply to certain industries.  If you&rsquo;re using these tools, have you considered:</p>\n<h1><strong>Do you use more than one tool?  If not, and you should, is there any actual overlap between their testing criteria?</strong></h1>\nThere is a certain incestuous phenomenon that develops in any SaaS industry that sees high profit margins: entrepreneurs perceive cloud-based solutions as having a low barrier to entry.  This perception drives new market entrants to cobble together solutions to compete for share in the space.  But are these fly-by-night competitors competitively differentiated from their peers?\n<p>Sadly, I have found in practical experience this not to be the case.  Too many times have I have enrolled in a free trial of a tool or actually shelled out for some hot new cloud-based scanning solution to find at best only existing known vulnerabilities are duplicatively reported by this new &lsquo;solution&rsquo;, with only false positives appearing as the &lsquo;net new&rsquo; items to bring to my attention.  Here in lies the rub &ndash; when new entrants to this market create competing products, there is an iterative reverse engineering that goes on &ndash; they run existing scanning products on the market against websites, check to see those results, and make sure they develop a solution that at least identifies the same issues.</p>\n<p>That&rsquo;s not good at all.  In any given security scan, you may see, perhaps, 20% of the total vulnerabilities a product is capable of finding show up as a problem in a scan target.  Even if you were to scan multiple targets, you may only be seeing mostly the same kinds of issues in each subsequent scan.  Those using this as a methodology to build quick-to-market security scanning solutions are delivering sub-par offerings that may only identify 70% of the vulnerabilities other scanning solutions do.  eEye has put together similar findings in <a href=\"https://www.eeye.com/eEyeDigitalSecurity/media/White-Papers/Analyzing-the-Accuracy-and-Time-Costs-of-Web-Application-Security-Scanners-WP.pdf?ext=.pdf\" target=\"_blank\">an intriguing report</a> I highly recommend reading.  Investigating the research and development activities of a security scanning provider is an important due diligence step to make sure when you get an &ldquo;all clear&rdquo; clean report from a scanning tool, that report actually means something.</p>\n<p>How do you judge your security vendor in this regard?  Ask for a listing of all specific vulnerabilities they scan for.  Excellent players in this market will not flinch at giving you this kind of data for two reasons: (1) a list of what they check for isn&rsquo;t as important as how well and how thoroughly they actually assess each item, and (2) worthwhile vendors are constantly adding new items to the list, so it doesn&rsquo;t represent any static master blueprint for their product.</p>\n<h1><strong>Does your tool test more than OWASP vulnerabilities?</strong></h1>\nThe problem with developing security testing tools is in part the over-reliance on the standardization of vulnerability definition and classifications.  While it is helpful to categorize vulnerabilities into conceptually similar groups to create common mitigation strategies and mitigation techniques, too often security vendors focus on <a href=\"https://www.owasp.org/index.php/Category:Attack\" target=\"_blank\">OWASP attack classifications</a> as the definitive scope for probative activities.  Don't get me wrong, these are excellent guides for ensuring the most common types of attacks are covered, but they do not provide a comprehensive test of application security.  Too often the types of testing such as incremental information disclosure, where various pieces of the system provide information that can be used to discern how to attack the system further, are relegated to manual penetration testing instead of codified into scanning criteria.  Path disclosure and path traversal vulnerabilities are a class of incremental information disclosures that are routinely tested for by scanning tools, but they represent only a <em>file-system</em> basis test for this kind of security problem instead of part of a larger approach to the problem through systematic scanning.\n<p>Moreover, SaaS providers should consider DoS/DDoS weaknesses as security problems, not just customer relationship or business continuity problems.  These types of attacks can cripple a provider and draw their technical talent to the problem at hand, mitigating the denial of service attack.  During those periods, this can and <a href=\"http://krebsonsecurity.com/2013/02/ddos-attack-on-bank-hid-900000-cyberheist/\" target=\"_blank\">has recently been</a> used in high-profile fake-outs to either generate so much trash traffic that other attacks and penetrations are difficult to perceive or react to, or to create opportunities for social engineering attacks to succeed with less sophisticated personnel while the big-guns are trying to tackle the bigger attacks.  Until weaknesses that can allow for high-load to easily take down a SaaS application are included as part of vulnerability scanning, this will remain a serious hole in the testing methodology of a security scanning vendor.</p>\n<p>So, seeing CVE identifiers and OWASP classifications for reported items is nice from a reporting perspective, and it gives a certain credence to mitigation reports to auditors, but don&rsquo;t let those lull you into a false sense of security coverage.  Ask your vendor what other types of weaknesses and application vulnerabilities they test for outside of the prescribed standard vulnerability classifications.  Otherwise, you will potentially shield yourself from &ldquo;script kiddies&rdquo;, but leave yourself open to targeted attacks and advanced persistent threats that have created embarrassing situations for a number of large institutions in the past year.</p>\n<h1><strong>What is your mobile strategy?</strong></h1>\nNative mobile applications are the hot-stuff right now.  Purists tout the HTML5-only route to mobile application development, but <a href=\"http://venturebeat.com/2013/04/17/linkedin-mobile-web-breakup/\" target=\"_blank\">mobile web development alone</a> isn't enough to satisfy Apple to get access to the iOS platform, (since 2008) and consumers still can detect a web app that is merely a browser window and prefer the feature set that comes from native applications, including camera access, accelerometer data, and usage of the physical phone buttons into application navigation.  The native experience is still too nice to pass up to be at the head-of-the-class in your industry.\n<p>If you&rsquo;re a serious player in the SaaS market, you have or will soon have a native mobile application or hybrid-native deliverable. If you&rsquo;re like most other software development shops, mobile isn&rsquo;t your forte, but you&rsquo;ve probably hired specific talent with a mobile skill set to realize whatever your native strategy is.  Are your architects and in-house security professionals giving the same critical eye to native architecture, development, and code review as they are to your web offering?  If you&rsquo;re honest, the answer is: <strong>probably not</strong>.</p>\n<p>The reason your answer is &lsquo;probably not&rsquo; is because it is a whole different technology stack, set of development languages, and testing methodology where the tools you invested in to secure your web application do not apply to your native application development.  This doesn&rsquo;t mean your native applications are not vulnerable, it means they&rsquo;re vulnerable in different ways that you don&rsquo;t even know or are testing for yet.  This should be a wake-up call for enterprise software shops: because a vulnerability exists only on a native platform does not mitigate its seriousness.  It is trivial to spin up a mobile emulator to host a native application and use the power of a desktop or server to exploit that vulnerability on a scale that could cripple a business through disclosure or denial of service.</p>\n<p>Your native mobile security scanning strategy should minimally cover two important surface areas:</p>\n<ol>\n<li>\n<p>Vulnerabilities in the way the application stores data on the device in memory and on any removable media</p>\n</li>\n<li>\n<p><a href=\"http://arstechnica.com/security/2013/02/mobile-app-security-always-keep-the-back-door-locked/\" target=\"_blank\">Vulnerabilities in the underlying API serving the native application</a></p>\n</li>\n</ol>\n<p>If you&rsquo;re not considering these, then you probably have not selected a native application security scanning tool checking for these either.</p>\n<h1><strong>In Conclusion</strong></h1>\nSecurity is always a moving target, as fluid as the adaptiveness of the techniques of attackers and the rapid pace of change in technologies they attack.  Don't treat security scanning and penetration testing as a checklist item for RFP's or to address auditor's concerns -- understand the surface areas, and understanding the failings of security vendors' products.  Understand your assessments are valid only in the short-term, and re-evaluation of your vendor mix and their offerings on a continual basis is crucial.  Only then will you be informed and able to make the right decisions to be proactive, instead of reactive, regarding the sustainability of your business.\n",
				
				"date_published": "2013-05-29T16:40:34+00:00",
				"url": "https://blog.seanmcelroy.com/2013/05/29/doing-your-due-diligence-on.html",
				"tags": ["Security"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2012/09/15/thwarting-ssl-inspection-proxies.html",
				"title": "Thwarting SSL Inspection Proxies",
				"content_html": "<p>A disturbing trend in corporate IT departments everywhere is the introduction of SSL inspection proxies.  This blog post explores some of the ethical concerns about such proxies and proposes a provider-side technology solution to allow clients to detect their presence and alert end-users.  If you're well-versed in concepts about HTTPS, SSL/TLS, and PKI, please skip down to the section entitled 'Proposal'.</p><p>For starters, e-commerce and many other uses of the public Internet are only possible because the capability for encryption of messages to exist.  The encryption of information across the World Wide Web is possible through a suite of cryptography technologies and practices known as Public Key Infrastructure (PKI).  Using PKI, servers can offer a \"secure\" variant of the HTTP protocol, abbreviated as HTTPS.  This variant itself encapsulates other application level protocols, like HTTP, using a transport-layer protocol called Secure Socket Layer (SSL), which as since been superseded by a similar, more secure version, Transport Layer Security (TLS).  Most users of the Internet are familiar with the symbolism common with such secure connections: when a user browses a webpage over HTTPS, usually some visual iconography (usually a padlock) as well as a stark change in the presentation of the page's location (usually a green indicator) show the end-user that the page was transmitted over HTTPS.</p><p>SSL/TLS connections are protected in part by a server certificate stored on the web server.  Website operators purchase these server certificates from a small number of competing companies, called Certificate Authorities (CA's), that can generate them.  The web browsers we all use are preconfigured to trust certificates that are \"signed\" by a CA.  The way certificates work in PKI allows certain certificates to sign, or vouch for, other certificates.  For example, when you visit Facebook.com, you see your connection is secure, and if you inspect the message, you can see the server certificate Facebook presents is trusted because it is signed by VeriSign, and VeriSign is a CA that your browser trusts to sign certificates.</p><p><a href=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/11/facebooksigneduntitled.png\"><img class=\"alignnone size-full wp-image-142\" title=\"Secure Facebook Connection Example\" alt=\"\" src=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/11/facebooksigneduntitled.png\" width=\"451\" height=\"359\"></a></p><p>So... what is an SSL Inspection Proxy?  Well, there is a long history of employers and other entities using technology to do surveillance of the networks they own.  Most workplace Internet Acceptable Use Policies state clearly that the use of the Internet using company-owned machine and company-paid bandwidth is permitted only for business use, and that the company reserves the right to enforce this policy by monitoring this use.  While employers can easily review and log all unencrypted that flows over their networks, that is any request for a webpage and the returned rendered output, the increasing prevalence of HTTPS as a default has frustrated employers in recent years.  Instead of being able to easily monitor the traffic that traverses their networks, they have had to resort to less-specific ways to infer usage of secure sites, such as DNS recording.</p><p>(For those unaware and curious, the domain-name system (DNS) allows client computers to resolve a URL's name, such as Yahoo.com, to its IP address, 72.30.38.140.  DNS traffic is not encrypted, so a network operator can review the requests of any computers to translate these names to IP addresses to infer where they are going.  This is a poor way to survey user activity, however, because many applications and web browsers do something called \"DNS pre-caching\", where they will look up name-to-number translations in advance to quickly service user requests, even if the user hasn't visited the site before.  For instance, if I visited a page that had a link to Playboy.com, even if I never click the link, Google Chrome may look up that IP address translation just in case I ever do in order to look up the page faster.)</p><p>So, employers and other network operators are turning to technologies that are ethically questionable, such as Deep Packet Inspection (DPI), which looks into all the application traffic you send to determine what you might be doing, to down right unethical practices of using SSL Inspection Proxies.  Now, I concede I have an opinion here, that SSL Inspection Proxies are evil.  I justify that assertion because an SSL Inspection Proxy causes your web browser to lie to it's end-user, giving them a false assertion of security.</p><p>What exactly are SSL Inspection Proxies?  <span style=\"text-decoration:underline;\"><strong>SSL Inspection Proxies are servers setup to execute a Man-In-The-Middle (MITM) attack on a secure connection, on behalf of your ISP or corporate IT department snoops.</strong></span>  When such a proxy exists on your network, when you make a secure request for [www.google.com](https://www.google.com), the network redirects your request to the proxy.  The proxy then makes a request to [www.google.com](https://www.google.com) for you, returns the results, and then does something very dirty -- it creates a lie in the form of a bogus server certificate.  The proxy will create a false certificate for www.google.come, sign it with a different CA it has in its software, and hand the response back.  This \"lie\" happens in two manners:</p><ol>\n<li>The proxy presents itself as the server you request, instead of the actual server you requested.</li>\n<li>The proxy states the certificate handed back with the page response is a different one than what was actually handed back by that provider, www.google.com in this case.</li>\n</ol><p>This interchange would look like this:</p><p><a href=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/11/interceptionproxy.png\"><img class=\"alignnone size-full wp-image-144\" title=\"SSL Interception Proxy executing Man-In-The-Middle Attack\" alt=\"\" src=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/11/interceptionproxy.png\" width=\"636\" height=\"247\"></a></p><p>It sounds strange to phrase the activities of your own network as an \"attack\", but this type of interaction is precisely that, and it is widely known in the network security industry as a MITM attack.  As you can see, a different certificate is handed back to the end-user's browser than what www.example.com in the above image.  Why?  Well, each server certificate that is presented with a response is used to encrypt that data.  Server certificates have what is called a \"public key\" that everyone knows which unique identifies the certificate, and they also have a \"private key\", known only by the web server in this example.  A public key can be used to encrypt information, but only a private key can decrypt it.  Without an SSL Inspection Proxy, that is, what normally happens, when you make a request to www.example.com, example.com first sends back the public key of the server certificate for its server to your browser.  Your browser uses that public key to encrypt the request for a specific webpage as well as a 'password' of sorts, and sends that back to www.example.com.  Then, the server would use its private key to decrypt the request, process it, then use that 'password' (called a session key) to send back an encrypted response.  That doesn't work so well for an inspection proxy, because this SSL/TLS interchange is designed to thwart any interloper from being able to intercept or see the data transmitted back and forth.</p><p>The reason an SSL Inspection Proxy sends a different certificate back is so it can see the request the end-user's browser is making so it knows what to pass on to the actual server as it injects itself as a proxy to this interchange.  Otherwise, once the request came to the proxy, the proxy could not read it, because the proxy wouldn't have www.example.com's private key.  So, instead, it generates a public/private key and makes it appear like it is www.example.com's server certificate so it can act on its behalf, and then uses the actual public key of the real server certificate to broker the request on.</p><p><strong>Proposal</strong></p><p>The reason an SSL Inspection Proxy can even work is because it signs a fake certificate it creates on-the-fly using a CA certificate trusted by the end user's browser.  This, sadly, could be a legitimate certificate (called a SubCA certificate), which would allow anyone who purchases a SubCA certificate to create any server certificate they wanted to, and it would appear valid to the end-user's browser.  Why?  A SubCA certificate is like a regular server certificate, except it can also be used to sign OTHER certificates.  Any system that trusts the CA that created and signed the SubCA certificate would also trust any certificate the SubCA signs.  Because the SubCA certificate is signed by, let's say, the Diginotar CA, and your web browser is preconfigured to trust that CA, your browser would accept a forged certificate for www.example.com signed by the SubCA.  Thankfully, SubCA's are frowned upon and increasingly difficult for any organization to obtain because they do present a real and present danger to the entire certificate-based security ecosystem.</p><p>However, as long as the MITM attacker (or, your corporate IT department, in the case of an SSL Inspection Proxy scenario) can coerce your browser to trust the CA used by the proxy, then the proxy can create all the false certificates it wants, sign it with the CA certificate they coerced your computer to trust, and most users would never notice the difference.  All the same visual elements of a secure connection -- the green coloration, the padlock icon, and any other indicators made by the browser, would be present.  My proposal to thwart this:</p><p><span style=\"text-decoration:underline;\"><strong>Website operators should publish a hash of the public key of their server certificates (the certificate thumbprint) as a DNS record.</strong></span>  For DNS top-level domains (TLD's) that are protected with DNSSEC, as long as this DNS record that contains the has for www.example.com is cryptographically signed, the corporate IT department of local clients nor a network operator could forge a certificate without creating a verifiable breach that clients could check for and then warn to end users.  Of course, browsers would need to be updated to do this kind of verification in the form of a DNS lookup in conjunction with the TLS handshake, but provided their resolvers checked for an additional certificate thumbprint DNS record anyway, this would be a relatively trivial enhancement to make.</p><p><strong>EDIT: (April 15, 2013):</strong> There is in fact an IETF working group now addressing this proposal, very close to my original proposal! Check out the work of the DNS-based Authentication of Named Entities (DANE) group here: <a href=\"http://datatracker.ietf.org/wg/dane/\">http://datatracker.ietf.org/wg/dane/</a> -- on February 25, they published a working draft of this proposed resolution as the new \"TLSA\" record.  Great minds think alike. :)</p>\n",
				
				"date_published": "2012-09-15T14:11:39+00:00",
				"url": "https://blog.seanmcelroy.com/2012/09/15/thwarting-ssl-inspection-proxies.html",
				"tags": ["Open Standards","Ethical Concerns","Privacy","Security"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2012/07/16/cnn-lies-to-every-one.html",
				"title": "CNN Lies to Every One of Its Web Viewers",
				"content_html": "<p>When is it okay to flat out lie to your users?  I would argue: <em><strong>Never</strong></em>.  But the website of one of the world&rsquo;s most watched sources of news, CNN, does just that.</p>\n<p>Near the bottom of every article is a section called &ldquo;We recommend&rdquo; and &ldquo;From around the web&rdquo;.  These sections list about six links to other articles either on CNN itself, other Turner properties, or simply as a paid referral service for selected partners.  So what&rsquo;s my beef with this?  It&rsquo;s not the targeted marketing, it&rsquo;s the outright lie I noticed they make when you hover over any of those links with your mouse.</p>\n<p>For some background, I&rsquo;m a huge dissident against outbound link tracking.  It&rsquo;s fundamentally the same as gluing a GPS tracking device to your forehead and giving a a tracking device to the website you&rsquo;re visiting.  I have a problem with it because I think there is a fundamental freedom that is eroded by this technology - the freedom to consume information without being tracked for doing so.  Do I have the right to pick up a magazine and browse through it without giving someone my telephone number?  I would say yes &ndash; I think it is a <a title=\"natural right\" href=\"http://en.wikipedia.org/wiki/Natural_and_legal_rights\">natural right</a> to be able to consume information without having your consumption observed.</p>\n<p>But my belief here isn&rsquo;t realistic &ndash; tracking basic visitor behavior and consumer preferences is the basic monetization and sustainability model for most of the Web as we know it.  So, this world doesn&rsquo;t mesh with my perfect world, but at least I should know if someone <em>is</em> observing my behavior, right?  Observing <a href=\"http://www.cnn.com/privacy.html\">CNN&rsquo;s privacy policy</a> one can clearly see the word &ldquo;link&rdquo; is referenced twice, once in relation to third-party sites that may cookie you, and once for integration to social media or other partner sites that may have differing privacy policies.</p>\n<p>Okay, fair enough, therefore I should expect that if I am surfing just CNN&rsquo;s website, if I disable cookies, and if I turn on my <a href=\"http://en.wikipedia.org/wiki/Do_Not_Track\">do not track header</a>, I should expect not to be tracked, right?  No, and the reason is I cannot find out when I&rsquo;m still on the CNN site to only stay within it.  The reason is CNN has specifically coded it&rsquo;s site to lie to me about when I&rsquo;m staying within it or navigating away.  For an example, if I were to hover over one example link in these two sections, I see the following in my browser status bar:</p>\n<blockquote>www.cnn.com/2012/07/15/sport/jason-kidd-arrested/index.html</blockquote>\nI right-clicked the link in Chrome and copied the URL.  Then curiously I noticed the link read differently in the browser status bar when hovering over it, this time reading:\n<blockquote>[traffic.outbrain.com/network/r...](http://traffic.outbrain.com/network/redir?key=ad68e2a0a57f3eb04e4553bf2e80b6b2&amp;rdid=349349184&amp;type=MVLVS_d/t1_ch&amp;in-site=false&amp;req_id=968ab83e0a0f44e584d8744520d2aea0&amp;agent=blog_JS_rec&amp;recMode=4&amp;reqType=1&amp;wid=100&amp;imgType=0&amp;refPub=0&amp;prs=true&amp;scp=false&amp;version=59070&amp;idx=3)</blockquote>\nYouch, what's that, and why did it change?  On closer inspection, by viewing the source of the page, I can see the target href of the link is exactly as reproduced above, going to traffic.outbrain.com.  I peeked at some other URL's in the same section that I had not yet left-clicked or right-clicked and noticed this:\n<blockquote>&lt;a target=\"_self\" href=\"http://www.cnn.com/2012/07/15/sport/jason-kidd-arrested/index.html\" onmousedown=\"this.href='http://traffic.outbrain.com/network/redir?key=10b8398e7c07227c8a8786b1682f1707&amp;amp;rdid=349349184&amp;amp;type=WMV_d/t1_ch&amp;amp;in-site=false&amp;amp;req_id=968ab83e0a0f44e584d8744520d2aea0&amp;amp;agent=blog_JS_rec&amp;amp;recMode=4&amp;amp;reqType=1&amp;amp;wid=100&amp;amp;imgType=0&amp;amp;refPub=0&amp;amp;prs=true&amp;amp;scp=false&amp;amp;version=59070&amp;amp;idx=4';return true;\" onclick=\"javascript:return(true)\"&gt;Knicks' Jason Kidd arrested on suspicion of DWI&lt;/a&gt;</blockquote>\nAnd herein is the deception -- this piece of inline JavaScript code changes the target of the link at the moment it is clicked to go to the traffic.outbrain.com address.  Because target href originally reads to the final destination of the article, hovering over it gives the false impression that my click will directly take me to it.  Instead, at the moment I click it, the target href is changed to the potentially unscrupulous third-party, and I have been given no browser notification this would happen prior to my click, and upon traffic.outbrain.com responding, it redirects me back to the original CNN article I initially wanted to view.  On a broadband connection, you probably wouldn't even notice the superfluous page load and redirect back to CNN's site.  Deceptive!\n<p>So, sure, why should anyone care?  Isn&rsquo;t this just plumbing, technology, and toolbox of tricks inherit of the Web?  Maybe, but the problem here is the lie.  <strong>You do not lie to your users.</strong><em><strong>  Ever.</strong></em>  Outbound web tracking is not a web beacon.  Web beacons are a different kind of &ldquo;evil&rdquo; - usually some JavaScript that opens an IFRAME to a third-party site that issues a cookie to track you; however, web beacons are covered by CNN&rsquo;s privacy policy, so if they were equivalent, it&rsquo;s all fair.  Web beacons can be simply disabled by turning off third-party cookies in today&rsquo;s browsers.  This is precisely why outbound link tracking is becoming popular - it circumvents the privacy management tools most users have available and have knowledge of.  Outbound link tracking is no more insidious than web beacons are, but the implementation of them often lies to the end user about what their action will do (a click in this case).  An honest implementation would be to either clearly state in the privacy policy that any links you click may be link tracked or simply not to deceive the user by rewriting the target href the moment they click it to actually go to the link tracking site so the browser status bar is truthful on hover (Twitter&rsquo;s t.co strategy).</p>\n<p>Well, at least it&rsquo;s just CNN at fault here.  At least no one else would stoop to such shady tactics.  Surely not Google (/url) or Facebook (l.php).. no, definitely not&hellip;</p>\n",
				
				"date_published": "2012-07-16T21:41:29+00:00",
				"url": "https://blog.seanmcelroy.com/2012/07/16/cnn-lies-to-every-one.html",
				"tags": ["Ethical Concerns","Facebook","Privacy"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2012/05/02/the-cost-of-speed.html",
				"title": "The Cost of Speed",
				"content_html": "<p>First off, I&rsquo;m quite dissatisfied with my work.</p>\n<p>But then again, isn&rsquo;t every architect?  No matter how fantastically we break down and lay out complex enterprise systems, there&rsquo;s always something to be dissatisfied with even the best logical designs, physical hardware, business logic, and user experiences.  We know well enough that enterprise software development is never complete.  Sure, user stories and discrete tasks can be marked &ldquo;complete&rdquo; in an issue tracking system, but large enterprise systems are virtual organisms that can be endlessly extended, refined, and improved upon.  There is no finish line, but rather a multidimensional cube of gradients where each metric of success is defined and measured by different stakeholders. So, when I state I&rsquo;m dissatisfied with my work, that&rsquo;s not a state of being, it&rsquo;s an acknolwedgement that architecting and developing these systems is a continuum of satisficing stakeholders, not a process that is ever truley complete.  We <em>should</em> be dissatisfied, because if we are not, we are complacent.</p>\n<p><strong>Measurements of Success</strong></p>\n<p>However, just because the composition of large and complex systems has no discrete end, it doesn&rsquo;t mean success cannot be measured.  There are a ton of metrics that can be derived to have some meaning to various parties in an ISV and the client ecosystem, some of which have meaning, and some of which can be predictors of success.  When I look at a system, I intrinsically think about the technical metrics first - the layers of indirection, query costs, how chatty an interface is, cyclomatic complexity, interface definitions, the segregation of responsibility, patterns that are reusable and durable from one set of developers to the next, et cetera.  But architects must understand that while these metrics do play a role in the ultimate success, re-usability, and appeal of a solution, they are not the same metrics a business user &ndash; usually those who define success at a more meaningful level for going concern of sustainable business &ndash; will consider.  Instead, these technical metrics contribute to other metrics that are the ultimate way in which a product&rsquo;s success will be measured and judged.  Specifically, there are only three things that executive offices, sales, and prospects care about:</p>\n<ol>\n\t<li>What does the system do?  (What are the features and benefits?)</li>\n\t<li>What does the system look like when it does it?  (What's the visual user experience?)</li>\n\t<li>How fast does the system do it?</li>\n</ol>\nNot that absent from that list is a metric worded like \"How does the system do it?\"  Inevitably the 'how' question is part of large Requests For Proposal (RFP's), but in my experiences, at the end of the day, those questions are mere pass-fail criteria that rarely play into an actual purchase decision or a contract renewal decision.  Quite often both junior and senior developers, and many times even management fails to keep this in perspective.  If a solution can demonstrate what it does -- and what it does is what a customer needs it to do, that it does it in a pleasing way, and that it does it fast, users are satisfied.\n<p>That last item, &ldquo;How fast does the system do it?&rdquo;, seems out of place, doesn&rsquo;t it?   Now any whiney sales guy (I used to work with a lot of them, thankfully we have an awesome team where I&rsquo;m at now) can tell you how a sluggish-feeling web page can tank a demo or blame a two second render time for a bacon he didn&rsquo;t bring home last quarter, and cloistered developers are used to brushing off those comments.  They really shouldn&rsquo;t.  Speed directly determines the success of a product in three ways:</p>\n<p><em>Users who have a slow experience are less likely to start to use the product</em></p>\n<p>KISSmetrics put together a <a href=\"http://blog.kissmetrics.com/loading-time/?wide=1\">fantastic infographic</a> on this subject that shows how page abandonment is affected by web page load times.</p>\n<p><a href=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/05/page-loading-time-by-kiss-metrics11.jpg\"><img class=\"alignnone size-full wp-image-79\" title=\"Page-Loading-Time-by-Kiss-Metrics[1]\" alt=\"\" src=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/05/page-loading-time-by-kiss-metrics11.jpg\" width=\"463\" height=\"279\"></a></p>\n<p>And let&rsquo;s not fool ourselves &ndash; just because your product is served on an intranet, not for the fickle consumption of the B2C public Internet, your users are no yes fickle or demanding.  Nor are you immune to this phenomenon because you utilize native clients or rich internet applications (RIA&rsquo;s) to provide your product or service.  Users will abandon your way to access their data if it&rsquo;s too slow, even if you might think they are a captive audience.  For instance, in a world where data liberation is a real and powerful force &ndash; where users demand to export their data from your system to use the interface of their choice, or even worse, where users demand you provide API&rsquo;s to your data so they can use your competitor&rsquo;s user interface &ndash; no audience is captive.  Even worse for those of you providing a B2C public Internet service, page load times play into search engine optimization (SEO) ranking algorithms, meaning a slow slight is less likely to even enter the consciousness of prospects who depend on a search engine to scope their perception of available services.</p>\n<p><em>Users who have a slow experience are less likely to continue using a product</em></p>\n<p>Let&rsquo;s say you&rsquo;ve enticed users with all your wonderful functionality and a slick Web 2.0 (I hate that term, for the record) user interface to visit your site, perhaps even sign-up and take it for a spin.  Most developers fail to realize that a clunky web browsing experience in an application doesn&rsquo;t just temporarily frustrate users, <strong><em>it affects their psychological perceptions</em></strong> about the credibility of your product (Fogg et al. 2001) as well as the quality of the service (Bouch, Kuchinsky, and Bhatti 2000).  <a href=\"http://blog.tagman.com/2012/03/just-one-second-delay-in-page-load-can-cause-7-loss-in-customer-conversions/\">In one case</a> which analyzed a large data site of an e-commerce site, a one second delay in page loads reduced customer conversion rates by 7%.</p>\n<p><a href=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/05/behaviour_model1.png\"><img class=\"alignnone size-medium wp-image-80\" title=\"behaviour_model[1]\" alt=\"\" src=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/05/behaviour_model1.png?w=300\" width=\"300\" height=\"285\"></a></p>\n<p>The <a href=\"http://www.neoinsight.com/newsletter/1011.html\">above graphic</a> is a visualization of a behavior model by <a href=\"http://www.bjfogg.com/\">BJ Fogg of Stanford University</a> about how users motivation and ability create a threshold to take action, and what triggers a product can use to entice users to cross that threshold depending on their position along this action boundary.  Truly fascinating stuff, but to distill it down into the context of this blog post &ndash; the marketing of your product and the value proposition of your service should be creating a high motivation for your end users.  What a shame then, if users never take action to use your product because you failed to reduce barriers to usage, reducing the ability and increasing complexity because your site was sluggish.  Crossing that boundary is one hurdle to cross, but ISV&rsquo;s have the ability to <strong><em>move the boundary</em></strong> in the way the market, design, and implement the product.</p>\n<p><strong>The Cost-Speed Curvature</strong></p>\n<p>Okay, okay, you got it, right?  The product needs to be fast.  But how fast is fast enough?  You can find studies from the late 1990&rsquo;s that say 8-10 seconds is the gold standard.  But back in reality, our expectations are closer to the 2-3 second threshold.  The wiggle room is admittedly extraordinarily small in this minuscule window: it doesn&rsquo;t accept any excuses due to the slow rendering speeds of ancient computers or low-powered mobile devices that might be using your site, the client&rsquo;s low bandwidth, or buffer bloat in each piece of equipment between your server&rsquo;s network card and your end user&rsquo;s.  Not to mention, most sites aren&rsquo;t simply delivering static, cache-able content.   They&rsquo;re hitting web farms of web servers behind load balancers, often using a separate caching instance, subject to the disk and network I/O of a database server and any number of components in between to execute potentially long-running processes &ndash; all of which need to happen in a manner that still provides the perception of a speedy user experience.</p>\n<p>Now, exactly how to get your product or service faster isn&rsquo;t my concern, and it&rsquo;s highly dependent on exactly what you do and exactly how you do it &ndash; your technology stack and specific infrastructure decisions.  What I can tell you though is you need an answer to your executive suite, board, or ultimate impatient user who, no matter how performant (or not) your system is, asks, &ldquo;How can we make this faster?&rdquo;  This answer shouldn&rsquo;t be quantitative, as in, &ldquo;We can shave 4 seconds off if we do Enhancement X, which will take two weeks&rdquo;, unless you want to hear your words parroted back to you when you can&rsquo;t deliver such an unrealistic expectation.  Even if you have an amazing amount of profiled data points about each component of your system, quantifying improvements is a mental exercise with little predictable result in enterprise solutions.</p>\n<p>Why?</p>\n<p>Well, in any serious enterprise software solution, there is obviously code you didn&rsquo;t write and pieces you didn&rsquo;t architect.  Even if you were Employee #1, and not inheriting a mess by a predecessor team or architect, inevitably you&rsquo;re using multiple black boxes in your interconnected system in the form of code libraries.  Even if you&rsquo;re a big <a href=\"http://en.wikipedia.org/wiki/Free_and_open_source_software\">FOSS</a> proponent and can technically look at any of the source code for those libraries, face it, in a real business you never will have the time to do so, if the nerdy interest.  While you can sample the inputs and outputs into each of those closed systems, you can predict but you cannot quantify how changing an input will affect the performance of a closed system creating an output.  Don&rsquo;t try it, you will fail.</p>\n<p>Instead, remember my opening paragraph &ndash; performance optimization, much like &ldquo;feature completeness&rdquo;, is not a goal, it is a process that is continual over the life of the product.  Obviously, developers start this process Googling <a href=\"http://stackoverflow.com/\">StackOverflow</a> et al. for &ldquo;slow IOC startup&rdquo; or &ldquo;IIS memory issues in WCF services&rdquo; or whatever the issue is with your particular technology stack, and will review the &ldquo;me too&rdquo; comments to see if they too did a &ldquo;me too&rdquo; misconfiguration or misdesign.  Maybe it&rsquo;s &ldquo;whoops, forgot to turn on web server GZIP compression&rdquo; or &ldquo;whoops, forgot to turn off debug symbols when I compile&rdquo;.  Typically, these are low-hanging fruit &ndash; low risk to affect change with a high potential impact.  But eventually you run out of simple &ldquo;whoops!&rdquo; Eureka moments or answers to simple questions, and you end up having to ask harder questions that have fewer obvious answers, thus requiring time spent specifically on researching those answers and developing solutions in-house.  When you think about it, there&rsquo;s a real escalating cost for each unit of performance gain over the lifetime of the product for this very reason.  Graphed as a curve, I&rsquo;ll call it the Marginal Cost of Speed:</p>\n<p><a href=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/05/marginal.png\"><img class=\"alignnone  wp-image-81\" title=\"marginal\" alt=\"\" src=\"http://blueprintsforsuccess.wordpress.com/wp-content/uploads/2012/05/marginal.png\" width=\"486\" height=\"349\"></a></p>\n<p>And this is, in fact, a reality that must be thoroughly understood inside a development team all the way up through the executive suite.  Not dissimilar to how Einstein postulated the only way to achieve infinite speed was to harness infinite energy, the only way to get an instance page-load or a zero-latency back-end process completion is by spending an infinite amount of resources achieving that goal.  I say this has to be understood at the development team level mostly because you will never, no matter how pragmatic and persuasive you are, convince the executive suite or the customer that you in fact cannot repeat the last thing you did that doubled performance, because the further you go down the performance optimization road, the narrower and longer it gets between mile markers.  The development team needs to fully understand what constitutes low-hanging fruit and must have their efforts focused on those simple changes that affect the greatest change first, and not tackle such problems with an instinctive impulse to refactor.</p>\n<p>Likewise, the executive and marketing teams need to understand the development of a lightning fast product is a <a href=\"http://en.wikipedia.org/wiki/Last_mile#Existing_delivery_system_problems\">last-mile problem</a>, that reaching that nirvana will require an increasing amount of time (cost) and resources (cost) to achieve it.  The effort is an exercise in <a href=\"http://en.wikipedia.org/wiki/Satisficing\">satisficing</a> the parameters to find an acceptable middle-ground.  Usually, though, the realities of product development aren&rsquo;t treated the same as the realities of other externally-governed factors, simply because they are perceived not to be governed by any absolutes since they are not external.  Put another way, customers of Amazon.com might abandon the site because shipping times for purchases are too long, but the company can&rsquo;t just start comp&rsquo;ing overnight service for everyone.  Well, they could do so, but the cost to acquire that customer just skyrocketed to a level that makes their business model unsustainable.  Similarly, the time spent on performance optimization has a real and measurable cost, and it can actually be quantified as a cost to acquire and retain a customer when you think about how a performant site directly impacts customer acquisition and retention.  Now, the business folks can definitely understand it in those terms.  But, they&rsquo;ll still want it faster anyway.</p>\n<p><strong>Where To Sit</strong></p>\n<p>So, where do you then sit on that curve?  The real answer is, it doesn&rsquo;t really matter how much you do or don&rsquo;t want to make performance optimizations, particularly if they&rsquo;re approaching the infinite cost asymptote of that graph.  The answer is, you will have to sit wherever your competitors sit.  Most of us out there building the next great thing aren&rsquo;t making markets, we&rsquo;re creating displacement products.  For those of us doing so, we&rsquo;ve got to chase after wherever your most successful competitor sits on the marginal cost of per speed graph.  Now, to be fair, those guys have probably been working for a few years on their ascent up that cost-performance climb, and they probably have deeper pockets / more slack time to do so than you do if you&rsquo;re breaking into a market, but there is a trade-off the suits can make.  The accumulated cost to 90% of the graph is less than the whole last 10%, so put another way, if you can be at least performant to make 90% of those prospects who are 100% happy with your competitor&rsquo;s product, that may well be enough to get displace enough business to let you keep tackling that last mile another day.</p>\n<p>Obviously, this question can&rsquo;t be completely answered that way, because it&rsquo;s highly dependent on your specific markets.  Are you entering a market with a democratic offering of grass-roots, home-grown alternatives or are you tackling an oligarchy industry?  Are you targeting disparate customers, or are your customers banded together in trade associations &ndash; which translates to &ndash; how much does your reputation change for each success or each failure?  How are your customers allowed to back out of a contract if they find performance or other factors don&rsquo;t match the vision sold to them?  These answers may make the &ldquo;how fast does it need to be&rdquo; answer necessitate a disproportionately higher amount of resources and time to get it where it needs to be to have a good, marketable value proposition.</p>\n<p>In summary, you never really should <em>sit</em> anywhere on that curve, you should be <em>climbing</em> it.  It will cost you more the further you climb, but you should never feel like you&rsquo;re done optimizing performance, and you should never stop continuously reviewing it.  Remember how I mentioned most of us are in the displacement business?  Even if you&rsquo;re not, someday, someone else will be, looking to displace <em>you</em>.  That guy might be me someday, and rest assured, I won&rsquo;t rest assured anywhere. :)</p>\n",
				
				"date_published": "2012-05-02T05:11:09+00:00",
				"url": "https://blog.seanmcelroy.com/2012/05/02/the-cost-of-speed.html",
				"tags": ["User Experience"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2011/08/21/its-about-the-developers-stupid.html",
				"title": "It's About the Developers, Stupid!",
				"content_html": "<p>Last week&rsquo;s continued equity market shakeups were made even more volatile by a few headscratchers:  Google purchasing Motorola Mobility for USD$12.5 billion (nearly $735 thousand per issued patent held by the company), and HP musing about spinning off its PC manufacturing business and potentially buying Autonomy to become a software and consulting house, an apparent IBM redux.  Endless articles and commentaries are focusing on Google&rsquo;s purchase of MMI, but the more interesting story to me is HP, and how their shift in business model is less about focusing on higher margin lines of business, but rather admitting failure in their purchase of Palm, and more generally, in building sustainable developer ecosystems.</p>\n<p>When big companies spend big money on massive acquisitions, they take on huge amounts of explicit, intrinsic, and opportunity risk that only a carefully designed strategy will vindicate.  When the stakeholders discuss only the balance sheet terms of deals they agree to, without really understanding the cultures of the external environments they depend upon, there&rsquo;s a lot of unmitigated risk, and ultimately, a lot of avoidable waste.  Arguably, Palm faltered and became an acquisition target for HP not because they had a inferior product or platform, but because they failed to nurture a strong developer ecosystem after Jeff Hawkins and Donna Dubinsky left to form Handspring.  When iterations of the Palm OS failed to deliver critical platform feature requests to keep the offering competitive, Palm addressed the problem by releasing webOS, years later, and with a cavalier attitude that they could build a new developer community around the offering without needing to mend their fences with their long-time supporters.</p>\n<p>We know what happened there - Palm stumbled, and HP picked up a compelling technology offering in webOS.  But HP made the same competitive mistake as Palm - it failed to foster a developer community to propel WebOS forward as the mobile operating system oligarchy was taking shape.  It, like Nokia with Symbian, did not appreciate the role of a thriving developer ecosystem in building a mobile brand, nor did they continue to continuously invest into it. Great technologies attract bright developers, who in turn make direct contributions to the ecosystem in the forms of apps, frameworks, and cloud services, and indirect contributions by recommending technologies to &lsquo;the suits&rsquo; who invest resources in leveraging them for their own ends.  This generates a current of innovation that can become self-sustaining, and this fills out direct to consumer &lsquo;app stores&rsquo; with features that intrigue consumers who make the ultimate platform selection through their purchases.  Let&rsquo;s face it, when you walk into a brick and mortar mobile phone store, you&rsquo;re not confronted by displays that put &ldquo;smart phones&rdquo; on one wall, &ldquo;camera phones&rdquo; on another, with old-style candy bar phones somewhere in the back - that was so four years ago!  Consumers today are targeted with marketing to compel them to choose an ecosystem &ndash; Android vs. iOS vs. Windows Mobile 7.  The hardware is become less relevant as a purchasing decision, because there&rsquo;s few physical differentiators other than form factor (which Apple continues to win, hands-down).</p>\n<p>Microsoft has understood this concept extremely well for decades, and they embrace their strategy by focusing on delivering excellent tool chains for developing applications that function on platforms (operating systems) they sell.  Despite Steve Ballmer&rsquo;s fanatical espoused enthusiasm on the matter, the company actually does make good on their word on investing in developers who invest in their technology.  They virtually give away expensive integrated development environments to secondary and post-secondary schools and create extensive supportive curriculum, documentation, and living communities that attract bright people and encourage other young minds seeking to connect with the brightest of their peers working on their technology.</p>\n<p>Microsoft&rsquo;s not alone in this strategy, but they&rsquo;re notable for how well they execute it.  Apple is one of the only notable exceptions to this process: attracting developers by rapidly building amazing market share.  Apple is a force to be reckoned with, for sure, but at the end of the day, &ldquo;suits&rdquo; decide to support iOS because of it&rsquo;s market share, not because their technologists and in-house developers extol the &ldquo;amazing development experience&rdquo; of iOS.  Nokia tried this and failed.  RIM is failing despite having a great market share position, at one time, for a mixture of technology capability and community support reasons.</p>\n<p>The lesson here, though, isn&rsquo;t restricted to the multinational, large-cap platform developers &ndash; even small, agile start-ups must quickly understand the importance and formulate strategies for building synergies to succeed.  Whether they&rsquo;re implemented through open source software, direct-to-the-community adoption initiatives, or strategic partnerships between peer companies, small businesses depend upon the rich technological feedback for continous improvement they cannot generate internally due to constrained early-stage resources.</p>\n<p>HP, though, doesn&rsquo;t understand or doesn&rsquo;t appreciate the &ldquo;how&rdquo; of building a real, working platform ecosystem is critical not only for innovative start-ups, but also for large-cap software firms.  And though HP may be throwing in the towel for mobile devices, this is a lesson critically important for any software company no matter what their distribution channel is: mobile, tablet, desktop, or enterprise servers.  The fact HP doesn&rsquo;t get it or is too encumbered to act on it, is the biggest threat to HP spinning off their low-margin, but reliable revenue generating manufacturing segment and plugging ahead.</p>\n<p>Ballmer should do his good deed for 2011 and ring them up with a tip: It&rsquo;s all about the developers, stupid!</p>\n",
				
				"date_published": "2011-08-21T17:54:53+00:00",
				"url": "https://blog.seanmcelroy.com/2011/08/21/its-about-the-developers-stupid.html",
				"tags": ["Technology Policies"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2011/08/12/will-state-treasuries-get-wise.html",
				"title": "Will State Treasuries Get Wise to Geolocation?",
				"content_html": "<p>Slowly, mobile users are becoming increasingly complacent with giving up the last remaining visages of privacy when it comes to using a mobile web browser or using mobile native apps to do the most rudimentary tasks.  Just five years ago, imagine the adoption rate an application would have that required your exact geographic location and the rights to read the names and phone numbers of your entire digital Rolodex to let you read the front page headlines of news.  It would fester in digital obsolescence through right-out rejection!  Today, it&rsquo;s a different ballgame.</p>\n<p>There&rsquo;s some interesting changes I can foresee that will come out of these shifting norms that have nothing to do with the overblogged concepts of targeted advertising or the erosion of our privacy.  There&rsquo;s an awesome company called Square has a nifty credit card reader that plugs directly into the audio port of a mobile device to create instant point of sale devices with a lot of flexibility and little capital investment.  Even this can&rsquo;t be called new  by today&rsquo;s blogosphere standards, but something that caught my attention in beta testing this service was its requirement to continuously track your fine GPS location as an anti-fraud measure.  Pretty sensical, but also, pretty telling of things to come.</p>\n<p>Anyone&rsquo;s whose been following the tech world recalls the recent tiffs between Amazon and various states, most recently of those being California, that have tried to get a slice of the revenue generated by sales addressed to their state.  Large corporations can keep playing evasive maneuvers with state legislatures, and small business brick-and-mortar retailers as well as state coffers continue to feel the squeeze as shoppers become continuously comfortable and familiar with making large ticket purchases online, both to comparison shop, but also, quite obviously, to avoid paying state and local sales taxes.  A looming federal debt crisis that is decades away from a meaningful resolution means less distributions to states, leaving each to pick up a larger share of the tab for basic services, infrastructure improvements, and some types of entitlements.  States have reacted two-fold: to try to squeeze the large online retailers with legislation, and secondly, to require state taxpayers to volunteer their &ldquo;fair share&rdquo; by paying use tax.</p>\n<p>Who accurately reports their online sales for the last tax year for the purposes of paying use tax?   Anyone that knows me is well aware of my almost maniacal love for and usage of budgeting tools that allow me to easily pull up a report of every online purchase I&rsquo;ve made in a given time period in a matter if seconds.  But many people who owe hundreds in state use taxes file their returns the same as my parents, who purchase nothing online, and report zero in this box.</p>\n<p>It would be relatively trivial from a technology perspective, but predictably forthcoming from a policy perspective, that this free ride is about to end.  One-third of smartphone owners have made a mobile online purchase from their phone, and a full 20% use their device as a fully-fledged mobile wallet.  47% of smartphone owners and 56% of tablet owners plan to purchase more products on their respective devices in the future.  With the skyrocketing adoption of mobile as a valid, trusted payments platform, it won&rsquo;t be long before a majority of physical goods transactions are made with these devices.  In the name of &ldquo;safer, more secure transactions&rdquo;, consumers will likely be prompted to, and likely won&rsquo;t think twice about, revealing their location from which they make that purchase.</p>\n<p>No matter how much we might muse to the contrary, legislators, nor their more technically savvy aides, aren&rsquo;t oblivious to the coming opportunity this shift will provide:  Imagine a requirement that any purchase made would log the location of the purchaser at the time the transaction was made, and charge online sales tax based on that location.  Since most mobile users spend their lives in their home location, this would keep a high percentage of taxes collected in this manner in the municipalities that provide services to the end consumer, reclaiming unreported taxable sales in a manner consistent with the collections prior to this massive behavioral shift.  It also levels the playing field for small retailers, who have to collect the same rates on their purchases.</p>\n<p>It&rsquo;s an intriguing scenario, and one not far from reality.  It may be this, and only this, that creates a consumer backlash against the complacent acceptance of leaking geolocation for anything other than maps or yellow page-type applications.  It may create scenarios where people travel to an adjoining town which creates a digital &ldquo;tax haven&rdquo; by instituting free municipal WiFi and low tax rates to drive a new form of digital tax haven tourism.</p>\n<p>In any case, it&rsquo;s definitely something to think about.</p>\n",
				
				"date_published": "2011-08-12T22:08:00+00:00",
				"url": "https://blog.seanmcelroy.com/2011/08/12/will-state-treasuries-get-wise.html",
				"tags": ["Privacy","Social Responsibility","Technology Policies"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2011/02/20/sonys-poor-behavior-what-does.html",
				"title": "Sony's Poor Behavior:  What does this say about learning in America?",
				"content_html": "<p>Ask any technical recruiter, or any quickly-growing technology business, what the number one challenge in the external environment is to growth, and the answer might surprise you.  In a resurgence reminiscent of the late 90&rsquo;s in Silicon Valley in social media and associated technologies that connect people, ideas, and cash, there&rsquo;s no lack of innovation, imagination, or good business ideas out there.  With investment tax credits and freely-flowing capital fueled by low interest rates and desperate federal, state, and local attempts to ignite the engines of industry and the economy, lack of funding or tightness of credit isn&rsquo;t the challenge it was two years ago.  Rather, the lack of sufficiently knowledgeable and adequately trained professionals in highly technical fields is the biggest roadblock to the economic expansion of the services industry.</p>\n<p>The cost of labor of highly skilled software engineers is increasingly well above the rate of inflation, having increased over 25% in the past 8 years.  (Just check out the term &ldquo;computer systems software engineers median annual salary&rdquo; on WolframAlpha.)  Simply supply and demand sets the price points for wages in local markets, and this trend broadly realized over the entire world has to make one wonder:  Where is the supply of new talent, and why is it not keeping pace with the growth demands of various technology-dependent industry sectors?  I postulate there is a widening knowledge gap analogous to the wealth gap in America, driven by the policy, legal, education and cultural environments.</p>\n<p>Specifically, legislation built to protect corporate innovations, including software algorithm patents, anti-copyright mechanisms, and the Digital Millennium Copyright Act are two-edged swords that stifle learning by today&rsquo;s technically-inclined youth by positioning technologies in untouchable black boxes.  Consider for a moment a future electrical engineer in the 1950&rsquo;s and what his potential contributions to his field would be if he couldn&rsquo;t dismantle a radio and learn how its components work.  What if programming languages were restricted from college classes to only corporations who could afford extortionate fees to access and learn technologies; would the networking revolution of the 1980&rsquo;s and 1990&rsquo;s have ever occurred?  If young men couldn&rsquo;t open the hoods of their cars without going to jail, would have have any more automotive innovation, even mechanics?  While corporations must be able to earn protected profits to cover their costs of research and development, those same innovations must be allowed to be embraced and extended not only in the broader macro-economy, but also understood, adopted, and applied by the upcoming generation in higher education.</p>\n<p>The higher education system itself, however, has been unable to keep pace with the imparting of technical knowledge specifically in business applications, leading to B-schools churning out freshly minted grads that understand some of the ideas behind requirements analysis and abstract system design, but who lack technical depth that cannot be dismissed by specialization difference, but is required in today&rsquo;s world where technology permeates every level of business, industry, and life.  These b-school graduates then go out into the world, often with a deficient understanding of the application of technology required to manage technical resources or properly apply them to real-world processes.  I believe this falls squarely in the fault of the lack of cross-disciplinary study plans that integrate related topics within a college, but fails to address the widening rift between engineers who are able to understand the inner workings of the technology, and the business majors who receive only a brush of experience with key concepts.</p>\n<p>As one university dean explained to me when I inquired why MIS majors were only required to take a single, general-purpose programming class without any exposure to reporting or datawarehousing concepts, upon which degreed candidates will be expended to understand in their first professional job, the answer was startling.  That PhD replied, &ldquo;We teach people to build businesses and manage technical talent.  They don&rsquo;t need to understand how the technical work is done.&rdquo;  Wrong.  Dead wrong.  Long past are the days when engineers can be enlisted for one-off projects and dismissed when their work is done.  In today&rsquo;s world, businesses that don&rsquo;t integrate automation, networking, communication, and social media technologies are being quickly replaced by more savvy, and often foreign entities, that understand the importance of every corporate level, from the board room to the mail room, embracing a cross-functional understanding of technology application.</p>\n<p>Restricting knowledge transfer is a sure-fire way to ensure you&rsquo;ll never be able to procure enough of it.  A great case in point of such ignorance and short-sightedness can be found in the Sony vs. George Hotz drama currently unfolding in technical circles.  A young man, Hotz, dared to open his PS3 and learn how it works.  Pages and pages of TOS&rsquo;s, AUP&rsquo;s, and EULA&rsquo;s explicitly forbid him from doing so, and now in retribution for sharing what he learned about what&rsquo;s inside the $600 black box he purchased, one of the largest companies in the world is actively suing him, and those he spoke to, to keep what they learned to themselves by applying the DMCA against them.</p>\n<p>The mass media has long abused and contorted the term &ldquo;hacking&rdquo; to apply to virtually any illegal, unethical, or criminal element that remotely involves technology.  First and foremost, hacking in its true sense, is learning what&rsquo;s not obvious.  If we have effectively criminalized this learning process both legally and culturally, we can sit back and watch our economic output dwindle as other cultures and nations which either through their abandonment of intellectual property protections or permissive discovery and learning culture prepare a more capable generation of tinkerers, whom individually and in greater numbers will show us up.  Sony&rsquo;s behavior in attempting to sue young men attempting to learn how they do what they do is driven by the assumption that knowledge can be owned, controlled, and metered.  While Sony may be able to apply punitive measures against a handful of the curious, the attempt to do so is not only futile (anyone remember what Napster did to the music recording industry?), but it creates a climate of fear and draconian policies that trickle down to further squelch off those who want to learn from being able to do so, both systematically by instilling a fear to do so will incur corporate wrath, or by discouraging institutions capable of imparting that knowledge from doing so as they attempt to shape ethical norms.</p>\n<p>A society that fundamentally believes that some knowledge should not be learned nor shared is doomed to pay its dues to societies that value knowledge creation, knowledge transfer, and raising future generations with the desire and ability to become as competent as their forbearers and extend the reaches of their contributions.</p>\n",
				
				"date_published": "2011-02-20T20:23:39+00:00",
				"url": "https://blog.seanmcelroy.com/2011/02/20/sonys-poor-behavior-what-does.html",
				"tags": ["Social Responsibility","Technology Policies"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2010/12/03/pp-dns-not-solving-the.html",
				"title": "P2P DNS: Not solving the real problem of centralized control",
				"content_html": "<p>The more tech-savvy probably noted with passing interest the news blip this last week by Peter Sunde, co-founder of The Pirate Bay, a notorious website for finding BitTorrent .torrent files for everything from public domain books to copyrighted music, video, and warez of a new peer-to-peer Domain Name System in response to recent US authoritarian action in seizing domain names.  The specific instance that is causing so much cyberangst is the Department of Homeland Security and Immigration and Customs Enforcement bowing to the pressures of media giants have shut down RapGodfathers.com.  By &ldquo;shut down&rdquo;, these enforcement agencies didn&rsquo;t just confiscate server equipment, they actually seized DNS hostnames assigned by their registrar, through ICANN.  Long has the rest of the world complained that IANA and ICANN, bodies that assign all sorts of global numbering and addressing schemes, are puppets of the U.S. Government, and even a number of the American tech crowd that the actions of these bodies over time are counter to the perceived free and open nature of the Internet.</p>\n<p>While DNS isn&rsquo;t that important from a purely technological networking perspective, that is, it is simply a redirection service, almost no denizens of the web could find Google, Facebook, or Bing without it.  DNS is a protocol that allows a simple name, such as example.com to be translated into an IP address, serving the role of a phone book of sorts.  I&rsquo;ll have to admit, just as I&rsquo;d probably lose all my friends if I lost my EVO, since I depend on my address books over memorized phone numbers these days &ndash; I only know some of Google&rsquo;s servers, my work, and my home IP address by heart, but for everything else, I&rsquo;m dependent on DNS to tell me (and my browser) where to find things.  In response to ICE&rsquo;s attack on the perception that domain names should not be commandeered by governments, Sunde has started a project to offer up an alternative DNS service over peer-to-peer networks, to remove the ability for corporations or governments to seize domains.  Unlike failed &lsquo;alternate root&rsquo; schemes in the past, this shift in technology would, as the thought goes, allow the domain name resolution service to be operated by consensus.  In such a world, ICE couldn&rsquo;t have seized RapGodfathers.com domain, nor could any corporation with a similar name as a private individual file a copyright claim to take a domain name away from them.  Do we have a fundamental right to allow the public to sign off on who gets to hold what URL properties?</p>\n<p>The rhetoric on the issue has been amusing at best and eye-rolling at worst, when people like Keir Thomas <a href=\"http://www.pcworld.com/businesscenter/article/212263/pirate_dns_could_hatch_a_lawless_darknet.html\" target=\"_blank\">make outlandish claims</a> that an alternate DNS scheme will be &lsquo;heartily embraced by terrorists and pedophiles&rsquo;.  Sadly, such claims showcase the true lack of technical understanding about how the networking protocols of the Internet actually work.  Coming back to my phone book analogy, a P2P DNS scheme would be akin to GOOG-411 providing phone numbers instead of my local phonebook (which sits unused, now 5 years old, mind you):  Anyone can one a phone number or IP address, but the way you resolve a name to a number doesn&rsquo;t really, on a true technical level, change anything about who controls access and availability to resources.  If I could configure my computer to point cocacola.com to illegal content, that doesn&rsquo;t change the fact the content was out there to point to in the first place, nor does it make it any easier to find for those not seeking how to access it.</p>\n<p>The real threat is when governments start mandating control over a protocol that hasn&rsquo;t yet become a household name &ndash; BGP.  Around in some form since 1982, BGP doesn&rsquo;t translate human-recognizable names into network numbers, it actually describes where to route those numbers.  When the Great (Fire)wall of China censors where its citizens can go, it does so by dictating that the numbers it doesn&rsquo;t want you to dial call non-existent places, or more realistically in the network world, that the paths to route your request to are wrong or dead-end.  Back to the analogy, controlling BGP is the end-game on the Internet&ndash; instead of taking over the phone book&rsquo;s printing presses, you take over the phone company&rsquo;s switching stations themselves.  For those wishing to make the Internet more autonomous and decentralized, the future to securing the existing global communications network from superpowers' total control lies in alternatives to BGP, not DNS.</p>\n<p>However, P2P BGP isn&rsquo;t going to happen, because as DNS instructs your computers where to go to find information, an attribute you can control yourself, BGP instructs your ISP&rsquo;s routers where to get their information, and you won&rsquo;t ever control their hardware.  And really, the fundamental issue is there&rsquo;s no clear way to keep the current networking stack of protocols we collectively call the Internet free and open, as we like to believe it should be.  Instead, for those wanting to leverage the crowd to free the Internet from tyrannous regimes or powerful special interests, your best bet for the future is <a href=\"http://freenetproject.org/\" target=\"_blank\">Freenet </a>or <a href=\"http://www.torproject.org/\" target=\"_blank\">Tor</a>, layers that sit on top of the Internet&rsquo;s infrastructure and provide their own.  They route requests and traffic through a &ldquo;tunnel-atop-the-tunnels&rdquo; approach that cannot be easily discerned nor controlled.  If the history of Internet governance has taught us anything, it&rsquo;s that if something can be controlled, the wrong entities end up controlling it.  The approach that Freenet and similar onion routing networks take is to remove control and technologically favor independent voices.  Instead of writing new technologies like P2P DNS to address yesterday&rsquo;s problems, I heartily recommend those with the interest and aptitude look into key-routing networks like Freenet, which by their very design prevent eavesdropping and circumvent traditional control mechanisms.  Just in their awkward teenage years, these will be the technology tools of digital patriots in the future, not P2P DNS on a network protocol stack that is increasingly being pulled out of the grasps of its grandfathers and architects.</p>\n<p>I will have to commend Sunde&rsquo;s efforts though, on the principal that if you do some Google keyword searching, ICE&rsquo;s seizure of RapGodfathers.com was only a spec on the web&rsquo;s map until Sunde&rsquo;s project was announced.  Raising awareness of who holds the keys to the words we write, read, and share is paramount in a world where most of the people who write, read, and share their thoughts over the Internet are generally otherwise without a clue to how their ideas are allowed or blocked by the powers above.</p>\n",
				
				"date_published": "2010-12-03T00:44:12+00:00",
				"url": "https://blog.seanmcelroy.com/2010/12/03/pp-dns-not-solving-the.html",
				"tags": ["Ethical Concerns","Privacy"]
			},
			{
				"id": "http://seanmcelroy.micro.blog/2010/08/05/be-assimilated-or-be-ignored.html",
				"title": "Be Assimilated, Or Be Ignored",
				"content_html": "<p>An interesting exercise is to visualize tidbits of data as material widgets, units of value that can be bought and sold in a marketing economy controlled by the forces of supply and demand. While completely relevant in an information and services-based economy, often we don&rsquo;t stop to put data, news, or information in the same contextual terms as goods we find in supermarkets or services we can find in the phone book.  (What is a phone book anyhow?)  All the same rules apply, however.</p>\n<p>For example, if I can find white socks of equal quality cheaper at a store next door, for me, this is a viable substitute, and I will vote on retailers with my purchasing power.   I am not, however, interested in purchasing raw cotton to spin my own socks.  I&rsquo;m just not equipped with the time or skill to take raw inputs of that nature to create the outputs I desire; the cost to do so is far greater than the opportunity cost I would incur doing things that make a lot more sense for my skill set.  Similarly, if I can find my news on Twitter, Facebook, or other blogs, where others have distilled facts and raw data into commentary and analysis, and if I can determine the quality is sufficiently the same for my needs, then I won&rsquo;t need to buy a newspaper, pay for online periodical archive access, or spend an opportunity cost in watching ads before each 30 second video on my local news channel&rsquo;s website.</p>\n<p>That&rsquo;s nothing new.  What is new is, my economic substitutes, or other sources for information consumption, have a key feature my previous choices did not:  aggregation.  Now, I don&rsquo;t even have to look at this information in the layout provided for me.  I don&rsquo;t need to view CNN&rsquo;s promotions, Google&rsquo;s AdWords, or Twitter&rsquo;s obnoxious color schemes when all my news feeds come into my Microsoft Outlook or Google Reader tool.  I pick and choose not only what I want to consume, but the manner in which it&rsquo;s displayed.  Were someone to make information unavailable for syndication or add inline advertisements to the syndicated content itself, I perceive there are many equally valuable substitutes, so I can nix any offending feed and replace it with another that meets my consumption demands.</p>\n<p>Any viable business needs to consider not only the importance of providing their content for aggregation to vie for a user&rsquo;s attention among other feeds, but also to build aggregation into their own offerings.  As aggregators begin to control not only where a user looks, but provide more advanced options to filter what feeds are recommended for users and further, what portions of feeds are selected for inclusion into a dashboard view, they will become the most important gatekeeper of the next decade.  They will control not only the screen real estate used to provide banner ads and inline contextual linkages to other promotional content, but they will also gain the power to shape what we think about and to what ideas we are exposed.</p>\n<p>For the rest of us, the bloggers and content providers, don&rsquo;t worry so much on your layout and formatting.  The way in which you deliver information loses relevancy compared to the actual value of the content you provide, and no matter how valuable you feel your analysis or commentary is, in a plugged-in world that encourages further social media interaction and feedback from smart people who may not be editorial experts, your offering is just a commodity.  You will become increasingly disconnected from your consumers, who will use the product of your data and information over channels you do not control and of which you may not even be aware.   You will lose your ability to monetize the delivery of your content, or at the very least, someone else will be giving you a faction of the channel they now own, a pay-for-play access fee to their aggregation or social network users.  It may not be what we want, but it&rsquo;s better than not being included in the new digital world order, as it were.  Or, in other words, prepare to be assimilated, or prepare to be ignored!</p>\n",
				
				"date_published": "2010-08-05T16:48:54+00:00",
				"url": "https://blog.seanmcelroy.com/2010/08/05/be-assimilated-or-be-ignored.html",
				"tags": ["Social Media"]
			}
	]
}
