メモリ容量チェック回避技

起動する際に自分でシステムリソース量やOSバージョンなどをチェックし、要件を満たさなければメッセージを出して終了する実装にしてあるアプリがあります。

Sun Microsystems社員だった12年前にそのチェックを回避する技についてブログを書きました。

There are applications which check Solaris version when it starts up.

Spoofing Solaris version using dtrace

当時は念のため書きませんでしたが SAP R/3 を無理やりサポートされてないバージョンのSolarisで動かそうとしてました。

そして昨日 Microsoft SQL Server をdockerで起動しようと試していてLinux版での回避方法を実装してあるdocker imageを見つけました。

modified to allow execution on a machine with less than 2 GiB of physical memory

justin2004/mssql_server_tiny: A Slightly Liberated Microsoft SQL Server Docker image

このDockerのSQL Serverの起動方法は以下です。

$ docker image inspect justin2004/mssql_server_tiny |
  jq -cr '.[0].Config.Cmd'
["/bin/sh","-c","LD_PRELOAD=/root/wrapper.so /opt/mssql/bin/sqlservr"]

wrapper.so を使えば他のアプリでもmemory sizeがどう返されるのかを確認できそうです。

docker も sqlservr も使わずに以下のコードでテストしてみました。

printf (“total RAM : %5.1f MB\n”, si.totalram / megabyte);

sysinfo: Obtaining System Statistics | Linux System Calls | InformIT

# ./a.out
system uptime : 37 days, 6:13:44
total RAM   : 991.1 MB
free RAM   : 130.7 MB
process count : 126
# LD_PRELOAD=$(echo /var/lib/docker/overlay2/*/diff/root/wrapper.so) \
 ./a.out
system uptime : 37 days, 6:13:52
total RAM   : 1907.3 MB
free RAM   : 132.1 MB
process count : 124

素での起動ではメモリ量は1GBと返ってきますがLD_PRELOADつけると 2GB と騙すことができました!

以上お役に立てば。。。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s