I have some initial thoughts based on my reading of the tweets in this stream:
“(FHIR app ecosystem) contained “pervasive authorization vulnerabilities” that enabled Knight to access > 4M patient and clinician records with just a single patient login account” This is truly frightening. Would love your perspective @motorcycle_guy @amalec @aneeshchopra https://t.co/EOHKNvzQT0
— claudiawilliams (@claudiawilliams) October 13, 2021
Here's what I expect to find, noting that this is only my guess as to what is happening:
Various apps rely on a FHIR backend which will allow a replay attack to be performed whereby:
- The attacker obtains access to the authorization token used by the FHIR API call to make other API calls on a different patient.
NOTE: There are a number of ways to obtain this authorization token depending on how the application is constructed and the level of access one has to developer tools, and application hardware and software. Assume that the hostile attacker is one in a million that has access to all of that, not the common high-school student (but don't count them out either, some of them are that good). Is ia a Java or .Net app? There's a debugger for that, and I can almost assuredly final all of your assemblies or jar files on my device emulator, and debug code running in a device. Did you obfuscate your code? If not, I can reverse compile it, there are tools for that too, and even obfuscation is not enough when you consider that platform calls are still going to be obvious, and all the important ones are well known, so I can work back the stack to the code I need to manually investigate. - The attacker constructs new API calls to make request using the same authorization token.
- The call succeeds because the only check that is performed on the authorization token by the back end server is that it is a valid token issued by the appropriate authorizer.
- Verify that what is being asked for is allowed to be asked for (never assume that the querant of your back end can only be your application)
- The data that is being returned also matches what the authorization allows the end user to see, and either filter, or simply reject the request (after having performed some work that you wish you hadn't).
Security is hard.Good Security is harder.Great Security is an ongoing work in progress.Perfect security does not exist.

