fix(security): close credential exfiltration, host key, plugin load and supply chain gaps - #2087
Merged
Conversation
…edited outside TablePro
…lePro's own hosts
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
# Conflicts: # CHANGELOG.md # TableProMobile/TableProMobile/ViewModels/ConnectionFormViewModel.swift
…n cannot pass as trusted
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Security review of the app and its build pipeline, with the fixes. Every finding below was traced to a concrete code path before being fixed, and three hypotheses were refuted with evidence rather than patched.
Highest impact
A shared link could steal an AWS credential.
tablepro://import?...&af_awsAuth=profile&af_awsRDSEndpoint=prod-db...made TablePro read~/.aws/credentials, mint a SigV4 RDS token signed for the real production endpoint, and send it as the password to the link author's host, withsslmode=requirewhich does not verify certificates. The import filter was a denylist of exactly one key. It is now a prefix and key block on every credential-resolution field, andRDSSigningEndpointResolveronly honours an endpoint override when the socket is a local forward or the override restates the host being dialled.Release workflows ran third-party actions from mutable tags.
setup-xcode@v1andaction-gh-release@v1sat in jobs holding the Developer ID certificate, the notarization password, and the Sparkle private key. A moved tag meant a signed, notarized, Sparkle-valid update to every user. All nine uses are pinned to a commit.Mobile never checked SSH host keys.
SSHTunnel.handshake()handshook and authenticated without callinglibssh2_session_hostkey. There was no known-hosts store and no prompt anywhere in the mobile target, so anyone on the path received the SSH password in cleartext. Mobile now has the same store and verification as the Mac, with a prompt whose default button is Cancel.libssh2 CVE-2026-55199. The
SSH_MSG_EXT_INFOhandler readnr-extensionsas an untrusteduint32and looped that many times while ignoring every_libssh2_get_string()failure. A server declaring0xFFFFFFFFpinned a CPU core before authentication. Patched, rebuilt for macOS and iOS, published, checksums updated.The rest
dlopen. Verification now runs immediately before the load, and again before a staged update replaces the installed copy.LOAD DATA LOCAL INFILEat the connector default. Disassembly of the shipped libmariadb showed a server cannot initiate the request, but the armed-query path could still substitute a file. Now disabled outright.connections.jsonwas unauthenticated, so anything that could write to the home folder could add apasswordSourceof kindcommandand have it executed on the next session restore, which is the default startup behaviour. The file is now bound to a keychain-held HMAC key. Password sources do not run when it changes outside the app, and loading connections is never blocked.FREETDSCONFto thatdbopencall, using the macOS system roots unless a CA is supplied./v1/integrations/exchangebefore authentication. A request carrying a disallowed browser Origin is now refused before routing.list_connectionsnamed connections the user had marked AI Never.pg_dumpstderr was logged atprivacy: .public, publishing internal hostnames and role names.Refuted, not fixed
Three findings did not survive investigation and are recorded so nobody re-opens them:
connectToLinkedConnectionrebuilds seven fields and routing resolves by UUID against local storage, so nothing reached a driver. The field is stripped from the cached pull anyway, before the consuming feature exists.~/Libraryand~/Library/Application Supportare bothdrwx------.Testing
23 tests added. 80 pass across every suite this branch touches,
swiftlint --strictis clean, and both the macOS app and the iOS app build.Two things I could not verify here. SQL Server certificate rejection needs a live server: point a Verify Identity connection at a host whose name does not match its certificate and confirm the connect fails. And the libssh2 rebuild is verified by the patch applying cleanly to pristine 1.11.1 and by both CVE patches appearing in the build log, not by a hostile server.
Known gaps
Redis Verify Identity still cannot check the hostname, because the shipped hiredis never calls
X509_check_host. Closing it needs a hiredis relink or a driver-side check. The iOS connection form still offers only an SSL on/off toggle for MySQL, PostgreSQL and Redis; those files are being edited on another branch, so they were left alone.https://claude.ai/code/session_0116PJisD2G7jZuVtQkbU1dC