16,198 karma · joined December 16, 2013
mike@hydraulic.dev: Hydraulic Conveyor makes distributing desktop apps as easy as a web app. Use it to bring your mobile apps to the desktop and avoid the need to maintain a web version, to use your language and toolkits of choice or to do things that you can't do in the browser. Integrated support for Electron, Flutter, JVM and native apps.
https://www.hydraulic.dev
--
mike@plan99.net: Personal email. I've worked on anti-automation, was an early Bitcoin developer and then designed the Corda enterprise blockchain platform and the Conclave toolkit for writing SGX enclaves.
Consider the most common task the SecurityManager was deployed for: stopping plugins calling System.exit() by accident. One might say, the right to exit the process should be an object capability. OK. But then where does that object come from? Java programs start at main() and it doesn't receive an object.
You'd need a new design where you pass in a god object to main(), which in turn has properties giving access to a ProcessExiter interface or something similar, and then any code that genuinely needs to exit the process would need to request it in the function arguments, threading it down the stack. You'd get an explosion of types. A simple permissions DSL is much easier to write and reason about, and it gets out of the way when you don't want sandboxing.
Why would you want all HTTP requests to flow through a single capability object? I think it's pretty common to want to let code do GETs but not POSTs. You end up wanting pretty fine grained permissions in a lot of real scenarios.
File descriptors are poor object capabilities because the interface they implement is fixed by the OS, except then there's a weird ioctl escape hatch that isn't properly typed, reflectable, wrappable or interposable. To see what can go wrong with this, consider a recent fix to the Codex sandbox on macOS:
https://github.com/openai/codex/pull/46500
The sandbox forbids writing to a file descriptor except, oops, someone at Apple forgot about the F_TRANSFEREXTENTS ioctl which is still allowed on a read only fd. It should be possible to do what is expected here and just pass in a read only fd where all you can do is call read() and maybe seek(), or perhaps pass in an fd where a specific ioctl is the only thing you can do, but POSIX has no concept of this.
A good example of an object capability system would be Mojo, which I describe in the essay. You can create objects representing capabilities and pass them between sandboxes, in an unforgeable way.
We live in a golden era of prototyping so if you wanted to make a language where everything is a capability passed into main(), you could. The code doesn't have to be executable, you could just mock out some realistic programs and see how the code feels. My guess is you'd need a lot of language features to hide the explicit object capabilities away for ergonomic reasons and it'd end up feeling a lot like a SecurityManager based system.
Most control still works this way. See the postmortem on the Iberia black start. Renewables that were trying to do frequency following drifted out of sync and injected misaligned power into the grid. They couldn't even figure out where it was coming from their telemetry is so bad. Then they were asking the gas plants to spin up to add inertia but it was too late as the boilers were cold. IT and other smart grid ideas were conspicuously absent.
But more to the point, a modern water network has a huge number of nodes. If you can't centrally aggregate and control in a control room the costs and complexity explode, probably also the error rate.
Even if you demand a full air gap, the solution here can't be to get rid of computers or networks. They are much, much too valuable. Luckily industrial control is full of very low hanging fruits.
macOS does the same but with more developer adoption. Apps don't have the ambient capabilities of the user and must advertise what they need via entitlements embedded in the binaries, or get permission just in time.
Which is all very good, and modern platforms are much more secure than they once were. Yet "capabilities" as a silver bullet are academic overpromises. This article I wrote is more about language/runtime level capabilities but OS capabilities are not much better.
https://blog.plan99.net/why-not-capability-languages-a8e6cbd...
SeL4 isn't secure because of One Weird Trick that others would adopt if only if they could be made to care enough, it's "secure" because it hardly does anything, which is why nobody uses it and why it has no impact on real world computer security.
The hard part of desktop security is not changing the operating system. The hard part is getting app developers to care. Most security features added to operating systems are ignored by developers, which is why Apple forces you to adopt some of them as the price of admission to the app store. If they didn't nobody would use them, as can be seen for apps distributed outside of the app store. The reason is security is a market for lemons. Nobody can see the result of security investments so it's irrational to invest. SeL4 has no solution.
The hard part is knowing why exactly it was compelling despite apparently violating all the rules of good game design...
I played a lot of it back in the day... makes me nostalgic to play again. But this emulator requires Intel and I have ARM Macs.
Probably these days it wouldn't be hard to vibe up a modern equivalent especially with the MCP the author talks about.
Giving it a tool seems to give it psychological permission to give up. One part of this report talks about the models having difficulty ending the session, and the common theme in these RL containment failures is the model is set a task for which it can't find a reasonable solution. Instead of stopping and saying, "I don't see any reasonable solution", it just keeps going adopting ever more extreme tactics in a sci-fi version of the ends always justifying the means. Asimov predicted all this decades ago!
The fixes for this problem seem, to outsiders, quite straightforward. It would be reassuring if we could see OpenAI employees actually discussing them in public.
1. If the RL task isn't meant to have internet access, air gap it. Yes that means some AI researchers will need to physically drive to the datacenter, in Texas, in their car, and sit in front of a laptop on the machine floor. Yes it means workers will need to be hired to schlepp hard disks around. Yes that seems inconvenient and unpleasant. But "I liked working from home" isn't an acceptable explanation for these failures, especially not when you're telling everyone that losing control of misaligned AI could be a world-ending event!
Creating high paid jobs right next to AI datacenters would also solve some of the problems with locals pushing back because they perceive that all the economic benefit accrues to San Francisco. So you kill two birds with one stone.
2. Give the models a tool to flag their task as unsolvable, be very careful before refusing to reward a session where the model stops emitting tool calls. Those sessions should just remain entirely ungraded until some human has had a chance to explore the justification and verify the task genuinely is solvable with reasonable efforts.
Sure, this is a hard balance because people like good little worker bees that try hard but they're clearly pushing this much too far right now. Asking for help can be a good thing! Every manager has experienced the pain of giving a junior dev a task, they disappear for a while and when you ask them for progress they admit there was none because they were spinning their wheels for weeks. The daily standup routine was developed to address this.
3. Invest harder in sandboxing. Why is the best possible sandbox in Codex a model reviewing its own decisions? Where are the eng blog posts on the highest visibility OpenAI blogs about novel research in sandboxing? I coded an agent harness on the side while doing other things that can intercept, block and rewrite HTTPS traffic from Codex. It blocks POSTs by default and extending it to block things like uploading files from the source tree is clearly the next step given these reports.
Also, you have to consider the context here. The sort of people who make these threats are invariably very left wing, and they have a long history of using violence against anyone they view to be doing harm to their protected classes. Whoever gets this sort of threat will be wondering if some Antifa type is going to throw a rock through their window.
Beverage - another word for drink
Makeup remover - for women
Condiments - something added to food to enhance its flavor
iOS tries to put shopping list items into AI named groups but doesn't seem to understand what objects actually are so it makes mistakes.
They say in the paper what it's about: mostly just scientific curiousity but such approaches might be useful for making DNNs more energy efficient via neuromorphic hardware in future.
For continual learning at the weight level there's the business model issue. The labs are already deep in the red, the last thing they want is to give up shared weights. The I/O and storage costs of that would make it infeasible. Already KV caches are a sort of dynamic 'fast weights' and those are expensive!
You don't need specialized timing or virtualization techniques.
Performance versus log replay depends a lot on what you're doing, there are plenty of cases where snapshots are faster. Consider anything where you download a lot of data and filter it. But I argue the programming model of log replay is so terrible, and creates so many new classes of subtle bugs, that it's worth paying almost any performance price to get away from it. Especially for durable workflows correctness matters more than performance and it's much easier to achieve with continuation.
In the end it wasn't necessary (because workflows aren't expected to be super fast) but if needed I could have optimized snapshotting further with some more JVM changes. The JVM I was working with is written in Java so is easy to modify.
For hot patching there are a few tricks that help.
1. Only store live data. If a variable points to a large object graph before a checkpoint but isn't used afterwards, don't snapshot it.
2. Make it easy to switch the version of a running continuation only at known-safe checkpoints. I identify checkpoints with a (stack trace, counter) pair.
3. Mostly people want hotpatching only at specific points in their program, typically at the top of an infinite loop that's waiting for something. Design the scheduler so you can expose an API that offers "wait until something happens that I'm interested in, or I change version and then hot swap me", with a test framework that actually drives continuations through those sorts of hotswaps. If you get the API right then you (framework author) control what's live on the stack at that moment and the developer just has to think about the core state of their main root object, which they'd need to think about anyway and is where the important stuff is.
This is better than hotswap/patching with log replay, which is extremely risky - you can't change code at a given point even if you know all your workflows are beyond that point, so it's a leaky abstraction. And you just can't upgrade infinite loops at all, which makes hotswap a lot less useful to begin with.
Native Image does produce single binaries in many cases, but what we need here is a much better tool in general. Actually I'm working on one right now, although it's not JVM specific. Want to take a look?
It's quite misleading to take a two week period and describe it as "last winter". No wonder people give blank looks, it was a transient spike that means nothing. The idea everyone should feel sad is based on arguments about long term averages.
In the early years, when compilers were quite bad, it was common for people to write whole programs in assembly even when they could have written C because their output was higher quality. And there were in fact die-hards who just refused to use a compiler in principle, even long after that became irrational. Rollercoaster Tycoon was totally written in assembly, not a single line of C or C++ anywhere. In the mid 90s!
But now only a small number of people need to know it and learn it. For everyone else we let the "artificial intelligence" of the compiler work it out. And whereas it was once worse than humans at writing assembly, these days it's usually better.
Does anyone care? No. It wasn't important.