GiteaでスパムBOTによって無限にユーザ作成と空のリポジトリ作成される攻撃に対しての対策としてやったことログ

概要

こんにちは、Rerurate_514と申します。
私は以前、ラズパイをリモートリポジトリサーバにするログにて、自分の保有しているラズパイ上でGiteaでリモートリポジトリを構築しました。それ以降、特に問題なく使用することができていたのですが、ある日ふと、エクスプローラーというタブを押してみました。


するとどうでしょう、たくさんの身に覚えのないユーザがリポジトリを作成していました

全然知らないユーザとリポジトリ群が大量に出現していました。
これらの中身を見ても、

このように空のリポジトリです。すべて。

ユーザも


このように謎のリンクと、謎のメルアドと、謎のbioで構成されていました。ほぼすべてがこのような形です。

ちなみに作成されたユーザ数は、管理者ユーザで見ることができます。


ここのサイト管理から

ユーザアカウントという項目を選択すると、

このようにユーザ一覧を見ることができます。
これは新しい順にフィルタしているのですが、IDが2397となっているので、その分だけユーザが作成されていますね。もう最悪です。

ちなみにここのアイコンから

ここのボタンからユーザアカウントを削除することもできます。

対策

1. app.iniを編集する

まずgiteaが動いているディレクトリのcustom/conf/app.iniを編集する。

cd custom/conf
nano app.ini //または自分の好きなエディタ

そうして出てきた、app.iniはこのような設定ファイルである。

APP_NAME = xxxxxxxxxxxx
RUN_USER = xxxxxxxxxxxx
WORK_PATH = xxxxxxxxxxx
RUN_MODE = xxxxxxxxxxxx
 
[server]
PROTOCOL = http
ROOT_URL = https://xxxxxxxxxxxx
HTTP_PORT = xxxxxxxxxxxxx
SSH_DOMAIN = xxxxxxxxxxxxxxxxx
DOMAIN = xxxxxxxxxxxxxxxxx
APP_DATA_PATH = xxxxxxxxxxxxxxxxxx
DISABLE_SSH = false
SSH_PORT = xxxxxxxxxxxx
LFS_START_SERVER = true
LFS_JWT_SECRET = xxxxxxxxxxxxxxxx
OFFLINE_MODE = true
START_SSH_SERVER = true
 
[database]
DB_TYPE = sqlite3
HOST = xxxxxxxxxxxxxxx
NAME = xxxxxxxxxxxxxxx
USER = xxxxxxxxxxxxxxx
PASSWD = xxxxxxxxxxxx
SCHEMA = xxxxxxxxxxxxxxxxxx
SSL_MODE = disable
PATH = xxxxxxxxxxxxxxxxxxxxx
LOG_SQL = false
 
[repository]
ROOT = xxxxxxxxxxxxxxxxxxxxxxxxx
 
[lfs]
PATH = xxxxxxxxxxxxxxxxxxxxxxxxxx
 
[mailer]
ENABLED = false
 
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION = false
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
ENABLE_CAPTCHA = true
REQUIRE_SIGNIN_VIEW = false
DEFAULT_KEEP_EMAIL_PRIVATE = false

公開しちゃダメそうな部分は隠しています。

ここの[service]という部分を編集していきます。

[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION = false
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
ENABLE_CAPTCHA = true
REQUIRE_SIGNIN_VIEW = false
DEFAULT_KEEP_EMAIL_PRIVATE = false

ここに項目を追加していく形です。

  • ENABLE_CAPTCHA = true: ユーザ新規登録の際にCAPTCHAを強制する。
  • REGISTER_MANUAL_CONFIRM = true: ユーザ新規登録を承認制にする。
  • DISABLE_REGISTRATION = true: ユーザ新規登録を停止する。
    • 正直これが一番早い

これらで必要な項目を選択して、app.iniに記述したら、giteaを再起動します。

sudo systemctl restart giteaとかなんか

2. 作成されたユーザを削除する

もちろん、手動でユーザアカウントを削除することもできますが、これを2000強回繰り返すのはとても苦行になります。
であれば、どうするのでしょうか。

このコマンドでgiteaのdbの場所を探す。

find / -name "gitea.db" 2>/dev/null

自分の環境では、このパスが表示された。

/opt/gitea/data/gitea.db

念のため、バックアップを取っておく。

cp gitea.db gitea.db.bak

このPythonコマンドによってIDが一定以上のユーザを削除することができる。
自分の場合はIDが5以上が全てスパムユーザだったので、これで削除

python3 -c "import sqlite3; conn = sqlite3.connect('/opt/gitea/data/gitea.db'); cursor = conn.cursor(); cursor.execute('DELETE FROM user WHERE is_admin = 0 AND id >= 5'); conn.commit(); print(f'削除成功: {cursor.rowcount} 件のスパムユーザーを消去しました。'); conn.close()"

結果としては、

削除成功: 2391 件のスパムユーザーを消去しました。

とのことで、合計2391ユーザがいたらしい。本当に最悪

でもこれで削除できた!

問題発生!!!

それやって、この問題が起きた!

バックアップを元に戻してから、空のリポジトリをGUIから削除
このページは管理者サイトから、メンテナンス ダッシュボードから行くことができる。


消してからもう一度実行
ただしコマンドは

i=5; while [ $i -le 2397 ]; do /opt/gitea/gitea admin user delete --id $i --purge; i=$((i+1)); done

で5番目~2397番目までをgiteaのコマンドを通して行った。どうやらsqlの直接操作はリレーションに影響を及ぼすらしく、コマンドから出ないと各所にエラーが起こってしまうらしい。

おわり!

これで、治ったよかった
リポジトリは自分の作ったものだけ残ったし、

ユーザも自分が作ったやつだけ残った!

本当にこういうことするBOTって何のために存在しているんでしょうかね?
個人的にはラズパイの計算資源とメモリの無駄使いなので本当にやめてほしいです。