iSCSI4NAS

SECURITY / ARCHITECTURE

Security that starts in the code.

Microsegmentation made networks safer: no computer reaches another unless a rule allows it. Picosegmentation does the same inside the code. No part of the program reaches another unless a gate allows it. iSCSI4NAS is built this way.

What is Picosegmentation?

Everything in code has an effect. An admin password just as much as a simple HTTP request. Picosegmentation gives every effect its own zone.

Microsegmentation divides the network into segments. Picosegmentation divides the program code into layers and zones. The layers are input, processing and output. Processing is further divided into zones: a password is handled in a different zone than a simple HTTP call.

Between two zones there is exactly one passage, the gate. That is where the decision is made whether an operation may take place. There is no second way. An effect only happens at a gate in the code.

This leads to the most important sentence on this page: a bug may sit in its zone. It cannot be used for the effect of another zone, because the way there does not exist.

Security does not end where the hardware ends.

A boundary where checking stops is a gap. Microsegmentation closes that gap in the network. Picosegmentation closes it in the code, exactly where bugs actually happen.

Computer science has known the individual building blocks for decades, such as permissions attached to objects, type checking and separated privileges. The protection only comes from the closed architecture that joins them into a whole inside the code. Aviontex developed this architecture.

Five levels

The SI prefix security model arranges protection in five levels. The names are familiar from units such as micrometre and nanometre: each step is finer than the one before. Picosegmentation is one of these levels, the level in the code.

The five levels of the SI prefix security model
LevelWhat is separated
MicroNetwork and connections
NanoiSCSI4NASProcesses and sandboxes: separate processes for iSCSI and for the app
PicoiSCSI4NASProgram code: layers and zones
FemtoHardware
AttoMicroarchitecture of the chip

No level replaces another. iSCSI4NAS implements Picosegmentation fully in its own code. For Nano it uses Apple's platform building blocks: separate processes and sandboxes. That is why the app can be updated without closing the connections to the NAS. For the other levels it relies on your network, Apple's hardware and the chip maker.

Why this changes so much

Today security is mostly found after the fact: write code, find the hole, ship a patch. Picosegmentation turns that around.

1

Whole classes of bugs disappear

Every program has bugs. With Picosegmentation they have no way to an effect. Data from the network stays data. It never becomes program code, control or configuration. Attacks such as injection lose their basis, not just a single hole.

2

Bugs show up while writing the code

Every effect needs its gate. Anyone who tries to create an effect without a gate notices it right away. Decisions happen at a few named places, they are logged and every rejection states its reason. A logic error therefore shows up early: during development, in operation and in review.

3

Tampering leads to a standstill

Every operation needs a permission that only comes into being at the intended gate. Changing the code breaks this chain. iSCSI4NAS then stops and shows the place. macOS adds its part: a modified program loses its signature and macOS does not load the driver.

The proof: PHP

What if PHP had been built with Picosegmentation?

In October 2026 PHP servers around the world had to be updated urgently. Two holes in the core of PHP allowed running foreign code without logging in (CVE-2026-109618 and CVE-2026-109619, fixed in PHP 8.5.12). In the first, an upload exhausts memory and the cleanup treats a half finished request as valid. In the second, state from one request slips into the next.

Both follow the same pattern as many holes before them: something that should only be data reaches an effect it was never meant for. With Picosegmentation that way does not exist. This makes PHP a good thought experiment. It is not a criticism of PHP. PHP has fixed many of these problems itself over the years.

The basic problem: classic PHP had only one type for almost everything, text. Four properties came on top:

  • Input everywhere. $_GET, $_POST and $_COOKIE could be read on any line, unchecked.
  • Full effect for everyone. Whoever reached the database connection could do anything with it.
  • One flat space. Every function could call every other function.
  • Soft boundaries. eval, include and unserialize undermined any order.

So any value from a request could be used anywhere for any effect: as a database query, as HTML, as a file name, as a shell command or as code. Read does not mean trustworthy. Stored does not mean approved.

The proof takes seconds. Take a known class of bugs in which text from the network reaches an effect. Then ask which passage it took to get there. With Picosegmentation that passage does not exist. This holds not for single holes but for whole classes.

Known classes of bugs and what Picosegmentation changes
Class of bugWhat happenedWith Picosegmentation
Memory and state (October 2026)An upload with any number of header lines exhausts memory. The cleanup treats the half finished request as valid. State from one request is read in the next.The bug stays in the zone that reads the upload. Cleanup and session live in their own zones and accept only what their gate releases. A half finished request is not a valid value there.
register_globals?admin=1 in the address became the variable $admin in the program. Data from the network turned directly into program state.There is no way from the request into program state. Input reaches the program only through a gate, as checked values with an origin.
SQL injectionInput was inserted into database queries and executed by the database as a command.Queries are built only on a dedicated path with placeholders. An input value stays a value and never becomes part of the command.
Remote file inclusioninclude($_GET['page']) let foreign code be loaded and run from outside.What may be loaded is on a fixed list. A value from the request can never become a load target.
Five more classes of bugs
Class of bugWhat happenedWith Picosegmentation
Cross-site scriptingInput ended up unfiltered in the HTML of a page and ran as a script in other users' browsers.HTML is produced only through the output gate. An input value stays text there and never becomes markup or script.
Object injectionunserialize() created arbitrary objects from network data. Their automatic methods could run code.Only defined types come into being, each through its own gate. Network data cannot create an object of its choice.
Type jugglingThe loose comparison "0e123" == "0e456" was true because PHP read both strings as numbers. Logins could be bypassed this way.A token is its own type with a fixed comparison. It is never read as a number.
Code from inputeval(), preg_replace with the /e modifier or function calls with names from the request ran input as code.What may be called is fixed. A name from the request can never become a call.
magic_quotesPHP escaped every input across the board without knowing where it would go. That often failed to protect and caused damage elsewhere.Escaping happens only at the gate into the specific effect, matched to exactly that effect. Never across the board at the entrance.
For developers: the places in the PHP 8.5.11 source
PlaceWhat the code doesWhat it leads to
Zend/zend_alloc.c
zend_mm_safe_error
Memory runs out. The code resets the marker and aborts the request.
heap->overflow = 0;
zend_bailout();
The abort leads into the cleanup of the request. The cleanup treats the half finished request as valid.
main/rfc1867.c
multipart_buffer_headers
Every header line of an upload is stored. There is no limit on their number.
while ((line = get_line(self)) && line[0] != '\0') {
    ...
    zend_llist_add_element(header, &entry);
}
Bytes from the upload decide how much memory is used. That is how an ordinary upload exhausts memory.
ext/session/session.c
early_find_sid_in
The session reads global values before the next request has its own state.
if (Z_ISUNDEF(PG(http_globals)[where])) {
    return 0;
}
potential_session_id = zend_hash_find(
    Z_ARRVAL(PG(http_globals)[where]), PS(session_name));
What the previous request left behind, the next one reads as its own state.

Segmentation at the wrong level. PHP did try protection through separation: with safe_mode, open_basedir and disable_functions. These are coarse barriers for the whole process. The effects inside the code stayed unseparated.

The safe way already existed. PHP had known queries with placeholders for a long time. But they were one option among several. With Picosegmentation they would have been the only way.

The result: there would still have been bugs in the code. But they would have stayed in their zone, because no way would have existed for text from the network to reach one of these effects. iSCSI4NAS is built exactly this way. What text from a request is for PHP, the data coming from the NAS over the network is for iSCSI4NAS.

Retrofit instead of rewrite

Picosegmentation does not need a fresh start.

Nobody has to change millions of lines of code at once. Just as microsegmentation grows segment by segment in a running network, Picosegmentation grows zone by zone in the code. You begin at the critical place, where data turns into an effect: where data comes in from the network, where something is stored and where something is executed.

This one gate already takes a path away from an attack. Every further update brings the next zone while the software stays in use. Nothing changes on the outside: interfaces and behaviour stay the same. This is days and weeks, not years.

What this means for your data

Every block you store on or read from your NAS passes through the initiator. That can include very sensitive data.

An attack on the initiator would therefore always be an attack on your data too: changing it unnoticed, mixing it between drives or redirecting it to a foreign target. Picosegmentation is there for the security of the initiator, for you and for your data.

Inside the initiator there is no way for such attacks. The description of a connection is kept apart from everything that comes in over the network. Data from the network therefore cannot redirect a connection. A read or write applies only to exactly the connection and exactly the drive it was approved for. And if the program is tampered with, it stops. It does not keep working on your data unnoticed with changed rules.

On its way through your network the data is currently unencrypted. That stretch is protected by the network level, meaning your own network between Mac and NAS.

See for yourself: in the app, iSCSI4NAS shows the result of the Picosegmentation integrity test under Diagnostics › Security and whether the connection between interface and core is authenticated.

iSCSI4NAS Home Edition: Diagnostics, Security tab, with a passed Picosegmentation integrity test and an authenticated connection between interface and core
iSCSI4NAS Home Edition, Diagnostics › Security: the Picosegmentation integrity test has passed and the connection between interface and core is authenticated.

Secure by design

iSCSI4NAS is picosegmented from the first line. Every effect has its zone and every zone has its gate. Data from the network stays data. A tampered app stops working. macOS does not load a driver without a valid signature.