One of the concepts that I think gets heavily overlooked in security is the idea of an assurance – the degree of protection a specific control provides. When speaking about assurance the discussion is how resilient a control is to attack; controls easily thwarted offer low assurance, controls very difficult to bypass offer high assurance. A 4 digit numeric password offers a lot lower assurance than an 8 character mixed case, alpha numeric password – other authentication policies being equal (account lockout on failed attempts, dictionary checks to ban common passwords, etc.), which in turn is lower assurance than an said 8 character password combined with some form of second factor (token, smartcard, OTP, etc.). Each of these provides very different resistance to the various automated attacks on authentication (targeted attacks, more often than not, exploit the user rather than the technical controls, though a second factor does provide more assurance relative to that as well).
NIST in their 800-63 Special Publication uses the concept to discuss authentication, mapping password policies and additional authentication factors to assurance levels (the levels are set by the sensitivity of the user role – the more sensitive the role the higher the assurance needed for the controls protecting accounts belonging to that role). Personally, while I do not think every organization should adopt the NIST publication as is, I think they should adopt the spirit of it when evaluating authentication policies. Too often the controls around authentication are qualitatively arrived at based on the gut feelings of someone in the company (if lucky, a security person, but how many AD account policies were decided by some random IT person). This model is a means of actually quantitatively trying to ensure that the controls are adequate.
Talking about assurance is very useful for a number of reasons. Using the example of authentication above, one of the most common questions from business people who believe a product’s password scheme is overly restrictive and offsetting to customers is “How likely is it that someone is actually going to hack our passwords to gain access” (as a quick aside, the real issue with passwords is that they are an all-around terrible control). Discussing password policies in that context is a losing venture – there really is no means of quantifying that likelihood. There are just too many variables without means of measurement – how do you come up with a probability that a person with the technical knowledge, inclination AND opportunity will attack the application/control? Switching the discussion from likelihood to assurance changes the conversation from defending a decision where you can’t possibly have concrete data to one in which you can. What the conversation then transforms to is the general tolerance the organization has for account compromise and how to engineer controls such that that tolerance isn’t exceeded. That is a much different conversation, and much more productive than guessing about the likelihood. It also is much better for the company – even if likelihood could be incredibly accurately predicted – if we knew the probability to 100 significant digits – it would still provide no protection. A probability of 1 in 1000 doesn’t mean it doesn’t happen, but that out of a thousand it will happen once. That something is incredibly improbable doesn’t help an organization at all if they happen to be that one.
More importantly though, shifting to a discussion of assurance and tolerance level moves software engineering to a model much closer to traditional engineering. When building a skyscraper there isn’t a discussion for the probability of an earthquake. Rather the engineers design the building to be resistant to a certain degree of seismic disturbance. This is a distinct change in how we discuss software. How many software teams have a discussion up front for their tolerances for certain types of failure? Actually quite a few – but their focus is on performance and availability. Conversations happen all the time around up time (we need 5 nines of availability for this, etc) that are very much in this vein, but they are largely the exception. What we as application security folks need to do is move that conversation to include other areas where it makes sense to define tolerances and engineer to assure those tolerances aren’t surpassed, whether it is the authentication system on our web app, the cryptographic storage on mobile clients, or any of the myriad of other areas where we consciously need to make decisions on protective controls. It also applies to general application quality where similar tolerance levels can be defined and engineered to.
~Joshbw