Becca rubbed her eyes, clutched her coffee, and stared at her half-eaten bagel as though it were a life preserver. She could use a life preserver: she was drowning in data.
In this case, no news was bad news. She was no closer to figuring out why the reactor had shut itself down than she’d been twenty hours earlier. Looking around the conference room, she could see that everyone else looked as bad as she felt. No consolation that. Everyone there—Fang-Castro, Crow, Greenberg, a couple of code jockeys, and Darlington, the ever-present videographer, recording the conference for posterity.
Self-consciously, she brushed her fingers over her hair. She was still getting used to having it cropped really close, but with the three-minute shower limit it seemed the most practical thing to do. The blond buzz cut she saw in the mirror each morning still startled her. If the marines took short and fat women… heh… she yawned: it had been another all-nighter, running on coffee and stims. Really, I’m too old for this all-nighter shit—that’s grad student stuff, she thought.
Fang-Castro rapped her glass and Becca forced herself to focus.
“Becca,” Fang-Castro began, “any miracles?”
“No. I’m really sorry, ma’am, but I don’t have anything new to report. I wish I could say we’ve found a flaw in design or in engineering or a bug in the code or something that we just plain did wrong. I can’t say that. Everything looks perfect on Reactor 2, hardware and software. Since we know there’s something wrong, I don’t feel like I dare fire it up again until I understand what the problem is.”
“I agree with Becca, on the hardware side,” said an engineer, Larry Trout, who had her back. She felt upset, frustrated, and irrationally furious at the reactor that wasn’t behaving itself, but she didn’t feel alone. She had the best engineers to work with, ever. “There’s no physical reason for the safeties to have gone off. Not once, definitely not twice. It’s gotta be a software problem.”
Becca nodded unhappily. “But we haven’t found it. The diagnostics and the test simulations all come up nominal. Maybe they’re faulty, too, but we get identical results from both reactors’ computers, and their codes match down to the last bit.”
Crow raised a finger. Fang-Castro said, “Yes, Mr. Crow?”
“I don’t think you’ll find any difference in the operating code,” Crow said. “I chatted with some of my colleagues, yesterday, about ways we could sabotage the power system, if we’d wanted to. They had some ideas. Especially about hiding the Easter egg even if you went looking for it. Most of the sabotage isn’t buried in the operating code, it’s in the data logs.”
Fang-Castro looked puzzled, but Becca immediately saw the possibilities, and they did not make her happy. “I know where you’re heading with this, Mr. Crow. I don’t like it. Go on…”
Crow nodded. “The operating code for both reactors is supposed to be identical and the build versions check. If someone had sabotaged only one of those, it would turn up in a byte-by-byte comparison of the systems. There are gigabytes of operating code, but that kind of comparison only takes seconds. Maybe a minute or so, if you’re looking for something that isn’t resident on the system but in the libraries.”
“The data logs are another matter. These have to be substantial?”
Becca made a mental estimate, then said, “Oh yeah, we log every bit of sensor data we can about the reactor performance in real time. It’s probably a hundred terabytes a day, maybe more.”
“Right. What my colleagues pointed out is that the log records for the two power plants will not be identical, because this is real-time data collected on real physical systems, and they don’t perform exactly the same. You can’t do a simple byte-by-byte comparison of the data logs, because they shouldn’t be the same. That’s where you hide the Easter egg.”
Fang-Castro said, “I’m not quite seeing it. Something has to put the bad data there, right? We should be able to find that.”
Crow smiled. “Ah, that’s the tricky part. The operating system is constantly checking the sensor readings and the data logs to make sure everything’s running within normal parameters. Bad data can creep into such a system. In fact, it’s almost guaranteed to.”
Becca chimed in, “For example, the operating system rejects negative pressure values. A noisy bit might switch the sign on a pressure reading once in a blue moon. You don’t want the system to respond to that and try to kick the pressure on the lines up. So there’ll be a line of code in the software that says, ‘If you see a negative value for pressure, ignore it and go look at the next value.’ Actually the range and type checking is a lot more complicated than that, but that’s the idea. It’s to make sure the system can’t get confused by obviously erroneous data.”
“Just so,” Crow said. “But suppose a small loophole were left in the variable checking. It would just take a few lines of code, but if it let the wrong kind of bad data through, that could trigger a fault or put the operating code into an unexpected state and open it up to all sorts of mischief. It might even be something as simple as a handful of code in the operating system that says something like, ‘If you read a pressure value of exactly 0.1876, then jump to the following library module.’”
Becca jumped in again. “Oh, I could get a lot more devious than that. We played pranks like this back at MIT. If I were being really nasty, I’d trigger a fault that would load code that was buried in the data log itself. Here’s how I’d do it in a couple of lines:
“When the attack code reads the trigger data, it loads the Easter egg code from the log. The Easter egg executes, and the first thing it does is erases its code from the log, along with the trigger data. Then it writes itself and new trigger data back into the log at a different point. That way the Easter egg is a moving target in memory and in time. That’s a lot harder to pinpoint. Next it triggers the reactor shutdown. Once it’s done that, it tells the operating system that it’s finished with this task and it’s relinquishing the block of memory it’s sitting in so that the operating system can load a standard library component back into that chunk of memory. It’s erased its footsteps—nothing to find.
“It’s all just strings of binary. The computer treats what’s in the operating system as programming instructions and what’s in the logs as data values. But there’s no reason it can’t load data from the logs as a program to be run. Normally, that wouldn’t make any sense, it would just crash the operating system and it would reboot. But if there really is code buried in there…”
Crow nodded approvingly. “Considerably simpler than what my colleagues had in mind, but it’s a starting point. Have you ever thought of coming to work for me? I could find a place for you.”
“I like my world fine, thank you very much,” Becca retorted. “But I’ll take the compliment.”
Crow said, “If it is sabotage, we don’t know this is what the saboteur did or exactly how they did it, what they’re using as a trigger. Could be a specific data value, could be an untrapped out-of-bounds fault, there’s a dozen ways to do this. And because it only takes a few lines of code to set it off, looking through the code factory’s maintenance and revision records wouldn’t tell you anything. If the Easter egg were resident in the operating system, there’d be thousands of lines of code, and you’d find the discrepancy in the records. But all that’s in the operating system is the tripwire. A couple of lines of odd code? That gets written every day. It can be as simple as a few typographical errors getting corrected. Nobody reviews the quality control records for a couple of lines of code unless it misbehaves, and this is designed to never misbehave without the trigger.”
Fang-Castro: “So why has this affected only one reactor and not the other?”
Becca responded, “I can think of several reasons. Maybe someone didn’t have time to insert it into the logs on both systems. Or maybe it got inserted in and then flushed and scrubbed in one of the log modifications. The logs are just big repositories for the data that’s collected from the two power plants. Essentially they’re nothing more than storage bins, and beyond making sure that they’re operating the way they’re supposed to, we don’t worry about them much. We don’t treat them exactly the same way.”
Fang-Castro ran her hand through her hair. “So you’re saying we got lucky. Or half lucky, half unlucky.”
Crow said, “I doubt that luck has anything to do with it.”
“And we can’t bring both reactors back online?”
“If I do, I’m pretty sure the second one is just going to shut down again,” Becca said. “I don’t see what we’d gain by it. Plus, these emergency shutdowns are hard on the system. That’s not the way it’s designed to be run. We keep this up and we’re going to break something before the mission is done.”
“How about wiping the data logs and starting from scratch?” Fang-Castro asked.
Becca started to say, “We could try that… ,” but Crow cut her off in mid-sentence.
“That’s such an obvious thing to do that if I were in charge of this little hack, it’s the first thing I’d make sure wouldn’t work,” Crow said. “It’d be very easy to circumvent.”
Fang-Castro sighed. “So we’re stuck with half power indefinitely. Assuming that, and that things don’t get worse, I had Navigation work up a revised trajectory for us.” She pulled up an orbit plot on the wallscreen. “The dashed line is our old trajectory. The solid one our new course. You can see there isn’t much difference.” She zoomed in on the part of the trajectory near the sun. “The main difference is we don’t need to come in quite as tight by the sun, because we won’t be traveling as fast. A perihelion of thirty-five million kilometers will be close enough for the sun’s gravity to swing us onto the right vector for Saturn. That should make you a little happier, Becca.”
Becca smiled just a bit. “I’ll take what good news I can get, Captain. It’ll put a little less strain on the radiators. Plus, since we will be running at half power anyway, we won’t need to throttle back when we’re close to the sun, like we had to in our original plans. The radiators have more than enough capacity to shed the waste heat, even that close to the sun.”
Fang-Castro continued. “That’s good. Of course, the bad news is that with only half the thrust we had before, we’re not going to get there as quickly. Fortunately we were already moving at a decent clip, fifty kilometers per second relative to the sun, when we lost Reactor 2. Consequently, the impact isn’t as bad as it could’ve been. When all is said and done, we’re going to arrive at Saturn about thirty days later than we’d originally planned. Our new ETA is January 23, 2068. That’s still more than three months ahead of the Chinese.”
She continued: “Mr. Crow, please have your colleagues put in some more thought on this problem and let me know if they come up with any ideas for eliminating the Easter egg from System 2. If there is one. In the meantime, Dr. Johansson, I suggest you reassign most of the System 2 personnel to System 1. Just keep as many people on 2 as you think you need to continue looking for the source of our problems there, but I want the priority to be pampering our one remaining power system and keeping it as happy as possible. So—let’s go.
“Ahh, Dr. Johansson?” Becca looked at Fang-Castro, who was tapping her slate. “I’m reinstating your med computer regimen. No more all-nighters. In fact, as soon as you finish reassigning personnel, and I’m giving you exactly one half hour to do that, I’m ordering you to go shower and get at least two hours’ sleep.” Fang-Castro looked at Becca more closely. “No, make that three hours. We’re out of crisis mode, and I need you in the best possible physical and mental shape to see that we don’t slip back into it. That’s all.”
Becca started to protest, but the look in Fang-Castro’s eye made it very clear that this was not a negotiating point. She closed her mouth, nodded, smiled a wan smile, and left the conference room.