Hi All,
I’ve only just started with Backendless, currently in the process of migrating the backend of my app away from bubble.io (due to impending dramatic cost increases) - but I’m having a lot of reservations about some of the security practices in play in backendless.
A few points on my background experience.
- I work in IT and cybersecurity and have been in this space for ~25 years. I specialise in IT & security architecture, cyber incident response and identity security - so my concerns are from practical exposure in these domains.
- I can write and understand code, but prefer to avoid writing it to save time - codeless is preferred
- I have read the documentation and forums countless times for answers, to no avail
My goal is very simple - I am trying to have bubble.io call my API to perform the heavy-lifting functions in my app (my app is very data heavy, with lots of many-many queries involved in the DB). In essence, the problem with bubble is that the upcoming pricing changes make performing any work in the app extremely costly, to the point where it makes the entire app unviable. I therefore aim to move the core heavy-lifting functions from bubble.io into backendless. As such, this will be a machine-to-machine integration, with bubble.io being the client and backendless being the server.
My concerns:
- No MFA on the main interface. Yes, I could go down the SAML path - but MFA is an essential feature these days, and users often like to reuse passwords in more than one place. A large account gets breached, a vulnerability gets found in the platform or the infrastructure goes down during the incident or response - I’m left high and dry without a backend to my platform (yes, this is a risk with any SaaS platform - but I digress…).
- Confusing permissions model - it is very convoluted, and even today I’m mystified how it actually works, as I am finding documentation and support posts often conflict and don’t even come close to explaining it in a way that even I can understand (Identity Security is one of my areas of expertise, FWIW!). Why not simply use the tried-and-true group-user-object permissions model? It’s well-known, simple and very secure when done right. At the very least, the current model needs to have a “RSoP” (Resultant Set of Policies) capability, to help people understand the final result of their configuration in the current model. The “NonAuthenticatedUser” is the most glaring confusion I’ve encountered, where the permissions of it seem to override my custom role, which doesn’t align with what I’ve read in the forums or the documentation. Documentation and training is also very unclear on how multiple roles interact with eachother.
- No simple means of validating user input in APIs being passed to the DB. It’s great to have full control over the data coming in and out of the database, but at the very least - always assume the user is malicious and trying to inject bad data. There should be an easy way to automatically escape any invalid data (e.g. with a checkbox in codeless) that could avoid any possibly of an attacker trying to extract or infiltrate the system. Not to mention the frustration of a single character (e.g. an apostrophe) breaking the query, THEN revealing the where clause used by the internal query (yes, I can override this behaviour, but not everyone will even know this risk…)! Any queries I send to a DB I always parameterise to ensure they are clean, but this doesn’t seem to be possible in backendless, where I’m instead forced to use raw SQL in the where clauses - to the point of adding quotes? Nobody should ever send a query direct, especially from user-generated input, for the exact points aforementioned.
- Security Logging - where is it and why isn’t it available to everyone? This is a mandatory feature for any system, and should be easily accessible irrespective of tier. How else can one determine if they are under attack or identify how an attacker got in, or what data was exposed? This is a serious concern, especially in GDPR or similar regimes.
- Permissions “Open by Default”. This just leads to bad code in the first instance. Yes, it is a hurdle for a non-coder to get their head around securing an app (especially with the confusing permissions model in backendless…), but honestly - if someone is writing an app for the first time, at the very least they should be forced to learn the basics of how to be secure on the Internet. There are enough serious data breaches these days, we don’t need more places for data to be stored insecurely and the lives of people being impacted by poor opsec practices.
- API key in the URL. This is just bad practice. Yes, it is easier to scale and automate with a WAF/LB - but it means your API key is not protected in any way during transit. It really needs to be in the header, at the very least.
Don’t get me wrong, I love the promise of backendless and the breadth of capability it offers - but there are some really glaring security concerns that I routinely see lead to compromise on a daily basis in my job. I really don’t need to be kept awake at night, particularly when I’m in the near future going to be dealing with GDPR concerns also. I need to feel confident I have done everything I can feasibly to secure my app, and right now - I’m not feeling the platform is going to allow me to do this due to these limitations. I’m open to being challenged on any of my points, some of which may be controversial, but even for my own sanity - I hope to be proven wrong!