すべてのファイルシステムが読み取り専用でマウントされた64ビットシステムで、ルートではなく32ビットアプリケーションを実行しているとします。アプリケーションはメモリに64ビットELFイメージを生成します。ただし、読み取り専用ファイルシステムのため、このイメージをファイルにダンプして操作を実行することはできませんexecve
。この画像からプロセスを開始するサポートされている方法はまだありますか?
注:ここで最大の問題は、32ビットモードから64ビットモードに切り替えても効果がないことです。潜在的に信頼できないハッキング。この問題が解決されると、問題全体がマイナーになります。ただカスタムローダーを作成してください。
答え1
うん、合格memfd_create
そしてfexecve
:
int fd = memfd_create("foo", MFD_CLOEXEC);
// write your image to fd however you want
fexecve(fd, argv, envp);
答え2
「userland exec」のようなものを探しています。ここで実装。デフォルトでは、これには外部参照を持たないいくつかの位置に依存しないコードをメモリにロードし、実行可能としてマークすることが含まれます。この場所に依存しないコードは、以前に実行された実行可能ファイルを削除して再ロードします。私が書いたuserland実行可能ファイルを少なくとも修正する必要があるかもしれません。
答え3
user732のコメントとリンクが古いしかし、ポイントは正しいです。 「userland exec」の実装が必要で、そのうちのいくつかがあります。どこでもPythonスクリプトを書くことはできませんが、実行できる場合は、次の便利なスクリプトを見つけることができます。https://github.com/anvilsecure/ulexecve/。私はこの記事を書いており、概要ブログ記事を使ってこの記事を世界に紹介することで、より詳細な情報を知りたいと思うかもしれません。https://www.anvilsecure.com/blog/userland-execution-of-binaries-directly-from-python.html
ulexecve
32ビットモードから64ビットモードに切り替えるように上記のコードを変更するのは非常に簡単です。これは私が検討したり実装したことのない興味深いユースケースです。しかし、@Ruslanが提案したアプローチはうまくいくでしょう。
noexec
Rapid7のMettleには、基本的に同じことを行うMettleというユーティリティもあります。https://github.com/rapid7/mettle。これはCで書かれた低レベルのユーティリティなので、別のELFバイナリで終わり、それを使用してユーザー領域の実行を実行できます。