最近啟動了部落格轉移計劃,打算把我的部落格從 ASP.NET + SQL 移到 ASP.NET Core + SQLite。前陣子試出 Ubuntu + SQLite + Dapper 令我信心大增,後續進展也挺順利,寫了匯入程式,從 SQL 匯出物件轉 JSON,開始將 JSON 資料轉換成新平台 Model,再用 Entity Framework 寫入 SQLite 資料庫。

不料,批次匯入時發現每次一轉到某篇文章時固定出錯,最可怕的是,出錯後整個資料庫檔案會消失無蹤。

頓如五雷轟頂!喵的,這還得了,一出錯整個 SQLite 資料庫檔案消失,網站全部內容化為烏有,如果這是 SQLite .NET Core 的 Bug,誰敢用?原本寄以厚望的架構這下要作廢了,心中猶如萬頭羚羊狂奔…

冷靜了一下,想想不對。SQLite 也算當今迷你資料庫主流,應用廣泛,不應存在如此嚴重 Bug,即使有也很快會被抓到並修復。

於是再反覆測試,發現一絲曙光。

SQLite 出錯的當下,桌面右下角剛好彈出 Windows Defender 警示:

啊!是防毒軟體搞鬼,SQLite 資料庫被誤判含有病毒,檔案消失原因是被防毒軟體隔離!由 Windows Defender 掃瞄記錄證實這點,blog.db 被判定包含 JS/ShellCode.gen 病毒遭到移除。

案情急轉之下,SQLite 無罪,仍是值得信任的好夥伴,我大大鬆了一口氣,接下來便是找出到底是哪篇文章造成誤判,避開即可。

有趣的是,批次匯入作業出錯都是在試圖寫入 Distributed Transaction With MS OLEDB Provider For Oracle 時,所以是這篇文章觸發防毒警報導致資料庫被刪,但這篇跟病毒有個毛關係?不得已,我使用愚公移山法反覆測試不同組合,最後找出問題跟另一篇包含木馬程式的 有趣的木馬解剖 文章有關。資料庫檔同時存在這兩篇文章會觸發 Windows Defender 誤判,單獨寫入其中任何一篇沒問題,只要別同時存在就沒事。

有趣的木馬解剖 由於內含解說用的木馬程式範例,過去已有多次被防毒軟體誤抓坐黑牢的記錄(木馬解剖一點都不有趣呀),為此也改過 CLSID,調過程式碼樣本,但跟另一篇文章組合而被誤判倒是頭一遭。

一怒之下,將程式碼部分都換成圖檔,徹底解決誤判風險,事件落幕。

A weird case of SQLite database file always disappear after I inserted a row of data. It turns out the antivirus mis-judged the data as trojan and deleted the whole database file.


Comments

Be the first to post a comment

Post a comment