The core Mosh code in Blink is current with Mosh after the 1.2.6 release, after my performance changes. That code creates a graph of differences/history via the smart-pointer shared Rows that it uses, though it doesn't explicitly use/look at the graph structure. I would have to review the code to be sure, but I think you might lose some info (probably resulting in larger differences) if you didn't save all diffs. I think you're safe blindly saving/restoring the entire list of states, and in the iOS client app save/kill/restore flow, it would be highly unusual for that complete list to take significantly more storage/compute than a more minimal list. For that to happen, I think you'd have to do something like

start a session
lose connectivity to the server
type quite a lot or paste a large amount of text into the frozen session
switch away from the app and invoke the state-save code

In the common case, where Mosh is idle or the updates reflect normal typing, the list of states will have one large initial state, and the following states will be empty or very small updates.

I would guess the saved state is unlikely to exceed 2MB even on the large iPad Pro, especially if you're able to save the state as serialized, compressed Messages. I recently did a small refactoring in the serialization and deserialization code paths that I think will help you access serialized but unencrypted Messages, actually. I wasn't even thinking of this problem at all-- I did it on general principles-- but now I'm happy I did it. See commit 255dc39. If it doesn't, let me know and we can try and improve that.

It's not clear (to me) whether encrypting the session on the network, and the session state on persistent storage, are the same security problem/domain. I think it might be better to use a separate, local key for encrypting the data at rest, and not reuse the session key, but it really requires some more thought and analysis. I vaguely recall that the iOS keystore has a get-and-destroy operator as well. If this actually exists and you used this in conjunction with a newly generated local key and maybe an OS boot-unique id each time you saved the state to persistent storage, I think that might nicely avoid the possibility of accidental session reuse. If the iOS keystore has key options to make the key volatile (non-persistent across reboot) and/or local (not backed up, iCloud, etc), these would also be useful in this case. Again, Crypto is Hard, and these are ideas, not advice.

I remember looking over the iOS keystore API and writing some email or notes previously, but I can't find that now-- if I find a private note I'll add that to this discussion.

regards,

  --jh

On 11/9/16 8:03 PM, Keith Winstein wrote:
Hello Carlos,

Sounds cool! I think you will need to save every state newer than the "throwaway number," because the other side is allowed to reference that state (or any newer state that you have acked) in building a new diff.

My main fear with these saved states is that a user would somehow be able to try "resuming" the same session twice, from the same save file. That will result in the same sequence number being reused, which would be cryptographically catastrophic. So any implementation that allows "resuming" from a saved state must ensure that the saved state is destroyed as part of the resumption.

-Keith

On Wed, Nov 9, 2016 at 3:14 PM, Carlos Cabanero <carlosecaban...@gmail.com <mailto:carlosecaban...@gmail.com>> wrote:

    I have started to work on “Persistent Connections” for Blink with
    great success! For background, these are the related GH issues
    (https://github.com/mobile-shell/mosh/issues/394
    <https://github.com/mobile-shell/mosh/issues/394>) and
    (https://github.com/blinksh/blink/issues/59
    <https://github.com/blinksh/blink/issues/59>).


    I hacked together - as in I have hardcoded most of the stuff - a
    simple version that is able to save a session to disk and
    reconstruct it given the previous key. Turns out it was all a lot
    easier than I thought, without requiring hardcore object
    serialisation. States (timestamp, sequence nonce and content) can
    be dropped to disk as if they were going to be sent over the
    network, and reconstructing the states to the initial
    Terminal::Complete and Network::UserStream objects is
    straightforward with the diff functions.


    There is the question of how many states should be saved, from
    reading the code I guess the answer is all of them, from my test
    only the latest acked one was enough - but again, crappy test.


    Another obvious security concern as the states contain information
    from the terminal in a completely readable format. Could that be
    encrypted again with the key before saving? In the case of iOS I
    can save the secure key to the keychain. But I think that on top
    of that, saving the session with a Passphrase might be a good idea.


    I understand that this might only be useful in Blink, but any
    guidance would be appreciated. In the same manner, if you change
    your opinion, I'm more than happy to walk the extra mile and make
    it work for everyone.


    Thanks a lot!!


    _______________________________________________
    mosh-devel mailing list
    mosh-devel@mit.edu <mailto:mosh-devel@mit.edu>
    http://mailman.mit.edu/mailman/listinfo/mosh-devel
    <http://mailman.mit.edu/mailman/listinfo/mosh-devel>




_______________________________________________
mosh-devel mailing list
mosh-devel@mit.edu
http://mailman.mit.edu/mailman/listinfo/mosh-devel


_______________________________________________
mosh-devel mailing list
mosh-devel@mit.edu
http://mailman.mit.edu/mailman/listinfo/mosh-devel

Reply via email to