9 ms·
Property-Based Testing Caught a Security Bug I Never Would Have Found
- mananaysiempre 9mo agoTL;DR: obj[key] with user-controlled key == "__proto__" is a gift that keeps on giving; buy our AI tool that will write subtle vulnerabilities like that which you yourself won’t catch in review but then it will also write some property-based tests that maybe will
- fireflash38 9mo agoDon't forget you can use AI to turn a 50 word blog post into a 2,000 word one!
- raphting 9mo agoExactly this! AI fluff all over in that article.
- latentsea 9mo agoYou're absolutely right!
- mirthturtle 9mo agoFor real. The bullet-point summary at the beginning with a "Why this matters for..." immediately followed by, "This isn't just a theoretical exercise—it's a real example of..." Dead giveaways.
- nslog 9mo agoDidn't react just have basically the same vuln
- mananaysiempre 9mo agoThe code in TFA is, by a hair’s breadth, not actually vulnerable, as long as the type signature of the function is obeyed. React spinned the same gun in the game of Russian roulette but was less lucky.
- toobulkeh 9mo agoIt also talks about using PBT and Randomness for some reason. This is clearly just a test value of a non-AI library written by a human. My take away is “don’t write your own input tests, use a library”. The rest is AI-slip
- mananaysiempre 9mo agoTheoretically a good fuzzer could discover this value by itself, but I don’t believe anything like that exists that could run JS code and explore VM-level branches, at least not for JS code that’s even this complex. Otherwise, yes, PBT is less trivial than it seems, though I’m guessing a simple `strings jsc` coupled with general knowledge of special values of other types[1,2] could get you quite far. [1] https://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/ https://www.exploringbinary.com/php-hangs-on-numeric-value-2... [2] https://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/ https://www.exploringbinary.com/java-hangs-when-converting-2...
- mhitza 9mo agoTechnically a property based test caught the issue. What I've found surprising is that the __proto__ string is a fixed set from the strings sampling set. Whereas I'd have expected the function to return random strings in the range given. But maybe that's my biased expectation being introduced to property-based testing with random values. It also feels like a stretch to call this a property-based test, because what is the property "setters and getters that work"? Cause I expect that from all my classes.
- arnsholt 9mo agoGood PBT code doesn't simply generate values at random, they skew the distributions so that known problematic values are more likely to appear. In JS "__proto__" is a good candidate for strings as shown here, for floating point numbers you'll probably want skew towards generating stuff like infinities, nans, denormals, negative zero and so on. It'll depend on your exact domain.
- sublinear 9mo ago> Is this exploitable? No. ... JSON.stringify knows to skip the __proto__ field. ... However, refactors to the code could ... [cause] subtle incorrectness and sharp edge cases in your code base. So what? This line of what-if reasoning is so annoying especially when it's analysis for a language like javascript. There's no vulnerability found here and most web developers are well aware of the risky parts of the language. This is almost as bad as all the insane false positives SAST scans dump on you. Oh I'm just waiting to get dogpiled by people who want to tell me web devs are dumber than them and couldn't possibly be competent at anything.
- yakshaving_jgt 9mo ago> most web developers are well aware of the risky parts of the language I don't think this is true, and I think that's supported by the success of JavaScript: The Good Parts. It would be unfair to characterise a lack of comprehensive knowledge of JavaScript foot-guns as general incompetence.
- oncallthrow 9mo ago> most web developers are well aware of the risky parts of the language In my experience this really isn’t true. Most web developers I know are not familiar (enough) with prototype pollution. By the way, this isn’t because they are “dumb”. It’s the tool’s fault, not the craftsman’s, in this case. Prototype pollution is complicated and surprising
- jgalt212 9mo ago> insane false positives SAST scans dump on you Great LLM use case: Please explain to the box ticking person why these "insane false positives SAST" are false and / or of no consequence.
- philipwhiuk 9mo ago> We write unit tests for the happy path, maybe a few edge cases we can imagine, but what about the inputs we'd never consider? Many times we assume that LLMs are handling these scenarios by default, Do we?
- RGamma 9mo agoI've seen companies advertise with LLM generated claims (~Best company for X according to ChatGPT), I've seen (political) discussions being held with LLM opinions as "evidence". So it's pretty safe to say some (many?) attribute inappropriate credence to LLM outputs. It's eating our minds.
- sevensor 9mo agoWhat’s interesting to me about this, reckless as it is, is that the conversation has begun to shift toward balancing LLMs with rigorous methods. These people seem to be selling some kind of AI hype product backed by shoddy engineering, and even they are picking up on the vibe. I think this is a really promising sign for the future.
- bpt3 9mo agoWhen "we" = "developers we imagined when using LLMs to generate this marketing slop based on a contrived scenario", then sure!
- bluGill 9mo agoThe original claim for TDD is your write tests for all your edge cases. It doesn't matter about inputs you didn't consider because they are covered in the edge. If you can only accept inputs from 2-7 (inclusive) you check 1,2,7,8 - if those pass you assume the rest work.
- deleted 9mo ago[deleted]
- Piraty 9mo agoIt's always good to write tests with the "The Enterprise Developer from Hell" in mind: https://fsharpforfunandprofit.com/posts/property-based-testing/ https://fsharpforfunandprofit.com/posts/property-based-testi...
- nslog 9mo agoThis is a great talk. More technical videos should be done from the basics like this.
- koakuma-chan 9mo agoThis kind of bug would never have happened if you used a proper programming language like Rust.
- kittoes 9mo agoThis just can't be your answer to everything... the article clearly stated that they're developing a client application for browsers. Rust advocates like yourself are really doing more harm than good by ignoring real world constraints.
- koakuma-chan 9mo agoYou can use Rust to develop client application for browsers. Check out dioxus.
- regular_trash 9mo agoRust is an unergonomic language that slows development in the general case (because it has lots of arcane syntax and rules, and people generally don't know it). Suggesting it as the "obvious" choice ignores the tradeoffs that come with adopting it for a project.
- koakuma-chan 9mo agoYou can just hire people who know Rust. One Rust developer would likely end up more productive than ten Cursor baby sitters in the long run, and you would actually get a high quality app.
- wredcoll 9mo agoThis is like some kind of psy-op to get people to hate rust.
- koakuma-chan 9mo ago