JAVA関連のことを調べてみた2021年12月11日

JAVA関連のことを調べてみた2021年12月11日

Log4Jゼロデイ脆弱性の概要と手法・対策方法

# 脆弱性の概要
Log4Jとは、Apacheが開発するJava用のロギングライブラリ。
Log4Jには、lookupという機能が含まれており、ログ出力時にランタイムに情報を出力することができる。
例として、`${java:runtime}`という文字列は、Javaのバージョン文字列に置換される。

その中でも、今回原因になったのは、Jndi Lookupである。
Jndi Lookupは、ネットワーク上から値を取得し置換するものである。
そのLookupの対象がLDAPの場合、指定されたURLからダウンロードしたクラスファイルを実行する。
そのため、インターネット上にLDAPサーバーを構築、悪意のあるプログラムを配置し、URLをLookupの文字列に当てはめ送信すると悪意のあるプログラムが実行されてしまう。

CVE: CVE-2021-44228

# 手法
LDAPサーバーを構築し、実行したいクラスファイルを配置する。
その後、URLを以下のように当てはめ、それをLog4Jで出力させる。
(QiitaはJava製なのか貼れないようになっていたため、pastebin)
https:

元記事を表示

SpringBootパスワードの相関チェック

#はじめに
今回は、SpringBootを使った相関チェックの実装を行ったので、備忘録として書いておきます。

#環境
– SpringBoot2.5.5
– SpringSecurity
– Thymeleaf
– MyBatis2.2.0
– MySQL5.6.50

#実現したいこと
僕の場合は、よくあるパスワードとパスワード(確認用)の2つが一致しないといけないというバリデーションを実現したいため、そのような実装を行いました。

参考文献にあるように、`@AssertTrue`を用いての実装を行い、上記仕様のバリデーションを実現しました。

#実装

“`java
import javax.validation.constraints.AssertTrue;

import lombok.Data;

@Data
public class SignupForm {

private String password;

private String passwordConfirmation;

@AssertTrue(message = “PasswordとPassw

元記事を表示

Log4jの致命的なゼロデイ脆弱性で今わかっていることのまとめと何が起きているのか(Minecraft中心)

この記事は [限界開発鯖 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/approvers) – 11日目の記事です。
本当は17日目が私の担当なんですが、なんと1週間も空きができてしまったので緊急で入れました。

Advent Calendarに相応しくない記事のチョイスですが、大急ぎで書いた内容なので大目に見てください。11日目はただただ辛いですが、12日目以降は楽しい記事が待ってます!お楽しみに!(自分の記事がまだ未定という大問題案件)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666481/c8a9ea50-c28f-8ca0-73f1-931c71d00df9.png)

:::note warn
この記事は “今わかっていること” と “何が起きているのか” を簡潔にまとめたものです。
(別に面白い情報など一切ないです、本来の担当日 17日目にご期待ください。)

ここにある情報が必ずも良いわ

元記事を表示

Log4j の脆弱性 (CVE-2021-44228) を試す

Log4j の脆弱性 (CVE-2021-44228) が問題になっています。

https://www.itmedia.co.jp/news/articles/2112/10/news157.html

https://www.lunasec.io/docs/blog/log4j-zero-day/

脆弱性を実感するため、[こちらの記事](https://www-cnblogs-com.translate.goog/yyhuni/p/15088134.html?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=en-US)を参考に、簡単に動かせるPoCを作成してみます。コードは以下にあります。

https://github.com/sohtsuka/CVE-2021-44228-PoC

## 必要な環境

– JDK 11
– Maven

## LDAPサーバーの準備

セキュリティテスト用に、JavaオブジェクトをLDAPから配信するようなサーバーを簡単に構築できる [marshalsec](https://github.com/mbechler/ma

元記事を表示

Visual Studio Code かわいくなるってよ

## Visual Studio Codeのフォントを変えよう

**「Viual Sutadio Codeでかわいいフォントが使いたい」**

そんなニーズがあると知ったので、早速やり方をまとめます。

## 前提事項
|No.|分類|前提|備考|
|–|–|–|–|
|1|OS|Windows 10 or 11|
|2|導入フォント|[うずらフォント](http://azukifont.com/font/uzura.html)|
|3|利用ツール|JDK|手順を統一する都合上、zipファイルを解凍するコマンドとして利用する。|

JDKは必ずしも必要ではありません。以下の場合は導入不要です。

* unzipコマンドが利用可能で手順を読み替えることができる
* explorerで開いて解凍するなど、代替の手順を考えることができる

脳死でコピペしたい場合に限り、[この手順](https://qiita.com/shupeluter/items/3ca0dfab64385d6da384#jdk)を参考にJDKを導入してください。

## fontの入手 とインストール

コマ

元記事を表示

Androidアプリでモバイルデータ通信とWi-Fiを同時に使う

## はじめに
Androidアプリでモバイルデータ通信とWi-FIを同時に使用します。
(TCPサーバを立てたり、GETリクエストを送ったりします)
本記事ではJavaを使用しAPIレベルは21以上とします。開発者オプションが必須です。

## 前提
### 開発者オプションの設定

「開発者向けオプション」→「ネットワーク」→「モバイルデータを常にON」を「オン」にすること。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653543/e381edad-0eb0-972b-e497-8e91d93dc373.png)

### permissionについて
INTERNET、ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE、CHANGE_NETWORK_STATEを使用する。
いずれも保護レベルが「normal」のpermissionである。

“`AndroidManifest.xml

元記事を表示

log4j2の脆弱性整理

log4j2についてなにが起こっているのかわからなかったので、
整理したことを記載する。

## 問題
![log4j_explanation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739718/d47f5694-eb4c-18fb-bcd1-358c04616707.png)

外部リソースへのアクセス情報が含まれたリクエスト情報を、
log4j2ライブラリのログ出力処理に渡すと、
ログ出力処理内で呼び出されているJNDIを通して外部リソースにアクセスできる。

攻撃者はlog4j2が外部リソースにアクセスできることを利用して、
ログ出力しているサーバ上で悪意のあるプログラムを実行させられる。

## log4j2
ロギングライブラリ。
数多のプロジェクトで利用されている。

## JNDI
Java Naming and Directory Interface
LDAPで、外部リソース(DB,ディレクトリサービスなど)にアクセスできるAPI

“`java
package com.sun

元記事を表示

【備忘録】Javaで日付時刻を文字列に変換

# 初めに

2021年現在でも「Java 日付 文字列」などで検索するといまだに`Date`と`SimpleDateFormat`が上位に出てくるので、`java.time`時代の参照すべきドキュメントと概要を備忘録として残す。

検証はOpenJDK11を使用していており、Oracleドキュメントのリンク先はJava17になっているが、基本的にはJava8から使えるはず。

# 日時オブジェクト

https://www.ne.jp/asahi/hishidama/home/tech/java/datetime.html

本記事ではJava8から導入された`java.time`パッケージのオブジェクトで日時を保持する。

“`java
LocalDateTime now = LocalDateTime.now(); // 現在日時
LocalDateTime ldt = LocalDateTime.of(2021, 12, 10, 20, 30, 0); // 指定した日時
“`

# 文字列に変換

## toString

日時オブジェクトの`toString`メソッドを

元記事を表示

(初心者むけ)Log4jのゼロデイ脆弱性って何がヤバいの?

#前書き

さて、今日はアドベントカレンダーの枠が空いてるな。もったいない。何を書こうか?とネタを考えていた矢先、なにやら周りが騒がしい。
原因は、このニュース。
良く分からないから調べてみた&初心者でもわかるように書いてみようと思った話です。

https://www.itmedia.co.jp/news/articles/2112/10/news157.html

#Log4jとは?

前書きの記事には「Javaで使われるログ出力ライブラリ」と書いてある。
簡単にいうと、 **アプリケーションにログ機能を組み込む際に使うOSSのツール** かな?
OSSのツールで、世界中のWebサイトで使われているというから影響範囲が広いということか。

Wikiも貼っておこう。最新の状況が追記されるかもしれない。

https://ja.wikipedia.org/wiki/Log4j

#何がヤバいの? どれくらいヤバいの?

この方のカイセツが一番分かりやすかった。あ、前書きの記事にもこの方が出ていた。

https://twitter.com/tkihira/status/14691764

元記事を表示

SpringBoot + gradle で log4j を 2.15.0-rc2 にする

# TL;DR

– あえて spring-boot-starter-log4j2 を入れてなければ Logback なので関係ありません
– 入れてるなら build.gradle の ext に以下を書き足してください

“`gradle
ext
{
set(‘log4j2.version’, ‘2.15.0’)
}
“`

## Maven 使ってる人へ

この記事は gradle 使ってる人向けなので Maven 向けの情報は記載してないです

# 自分が対象なのかを調べる

プロジェクトのルートで下記のコマンドを実行してみてください

“`shell
$ gradle dependencies | grep log4j
“`

`org.apache.logging.log4j:log4j-core:2.13.3` とか 2.15.0 よりも下のバージョンが出てきてしまったあなたは対象です。TL;DR を読んで build.gradle に加筆してください。

加筆し終わった後に再確認して、`org.apache.logging.log4j:log4j-core:

元記事を表示

Javaでディレクトリ配下のファイル属性を一覧で出力できるプログラム

仕事であるディレクトリ配下にあるファイルなどの情報を一覧で出力する業務が発生したので
それ用にプログラムを組んでみました。

    <b>プログラム要件</b>

  • 『ファイルパス ファイル名 サイズ 最終更新日時』 の順で出力する
  • ファイルパスの先頭にトップディレクトリは含めいない(./xxxxx/xxxxx.txtという形式)
  • ファイル情報は拡張子を含める
  • サイズはbyte単位で出力
  • 最終更新日時のフォーマットは『yyyy-mm-dd HH:MM:SS』とする
  • 各情報をスペースで区切る
  • 対象がファイルでなくディレクトリの場合はサイズではなくディレクトリの中のファイル数を出力する(ディレクトリの中のファイル数を再起的に探索)
  • 総ファイル数 総ディレクトリ数 総ファイル数を出力する

“`java
import java.io.File;
import java.io.IOException;
i

元記事を表示

1時間でSpringFrameworkのDIを説明してみた(1時間シリーズ第3弾)

#1時間でSpringFrameworkのDIを5分で分かるように説明してみた#

といっても、コードとかはほかのサイトに仰山あるみたいだし。
私は備忘録的に文章だけで説明いたします。

**結論:DIとは何か**
Dependency Injectionの略で、依存性注入っていう意味。

**メリットあるんか**
インスタンスの作成や初期化処理などを設定ファイルに切り出せるので、コードの見通しが良くなる。
DIコンテナにインスタンスのスコープやライフサイクルを管理してもらえる。

**デメリットあるんか**
設定ファイルが膨大な行数になったりする

**サルにも分かりやすく説明して(独自見解)**
まず、SpringFramework社長のDI会社というものがありました。
DI会社は派遣を提供する会社で、様々な部署があります。
しかもその部署には分身ができる優秀な忍者であればだれでも入社できることができます。
あっ、さっそく太郎君が「俺はお前に登録されるために生きてきたんだから、登録せい」とマークを付けてやってきました。
SpringFramework社長が太郎君含め入社希望の方を探

元記事を表示

expoでAndroid KeyStoreの生成に失敗した話

expoでandroid用のビルド申請をしようとしたところこんなエラーが…

“`
Failed to generate Android Keystore, it will be generated on Expo servers during the build
keytool exited with non-zero code: 1
“`
でも、よく見てみると…

“`
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
“`
こんなことが書かれている。

お分かりいただけたでしょうか?
私のパソコンにJavaが入っていないだけでした。

てきとーにインストールしてみましたところうまくいきました!
https://java.com/ja/download/

対戦あざした。

元記事を表示

GraalVM + Quarkus で Cloud Run に API を立てる

## GraalVM の概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265024/91f29757-30e1-7b1a-802d-c58cdb30a6b3.png)

GraalVM をご存知でしょうか。
Java を書いたことのある人なら JVM(Java Virtual Machine)という単語をなんとなく知っていたりいなかったりするかと思いますが、その JVM に代わるものとして GraalVM が存在します。

JVM は Java コンパイラでコンパイルされた Java バイトコードを実行してくれるわけですが、 Java バイトコードを実行すると一口に言っても内部的には大きく以下の2パターンで実行されることになります。

– **Java インタプリタが逐次実行**
– **JIT(Just In Time)コンパイラが再度コンパイルして実行**

さらに、 JIT コンパイラと一口に言っても内部的には大きく2つのコンパイラが存在します。

– **クライアントコ

元記事を表示

Javaを使用してPDF内の指定されたテキストを検索して置換する方法

##Javaを使用してPDF内の指定されたテキストを検索して置換する方法

##背景
PDFファイルの内容は簡単に変更されない、エクスポートしやすい、互換性の問題も存在していませんので、データの保存などにふさわしいです。でもPDFドキュメント内の特定のテキストを置き換えたい場合もよくあります。この記事では、Javaプログラムを介したPDF内の指定されたテキストコンテンツのバッチ置換を紹介します。

##プログラム環境の下準備。

コードコンパイルツール:IntelliJ IDEA
Jdkバージョン:1.8.0
Jarパッケージ:**[free Spire.Pdf.jar 3.9.0](https://www.e-iceblue.com/Download/pdf-for-java-free.html)**

本記事では無料版のPDF Jarを使用しました、また、JDKバージョンの上位バージョンを使用することをお勧めします。
jarファイルがインポートされた後、Spire.PDFによって提供されるインターフェースとメソッドを呼び出してPDFを操作できます。次のインポート結果を参照してくださ

元記事を表示

小ネタ:IntelliJでCSVファイルをテーブル形式で参照する

この記事は [ZOZO #3 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/zozo) 10日目の記事になります。

小ネタです。

DBUnitなどでテスト用のDBテーブルのレコードをCSVで用意することありますよね。

そのレコードを作るのが面倒だったりするのですが、IntelliJにはCSVをテーブル形式で参照できる機能があります。

![スクリーンショット 2021-12-06 18.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/0ce146a6-2ee9-850e-a0ff-c2b371288964.png)

たとえばこんなCSV。タイトルと行が位置あっておらず編集しずらいです。

![スクリーンショット 2021-12-06 18.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/24

元記事を表示

DBからselectした複数レコードの先頭レコードだけ取得する方法。

limitを使う。

ただし、mybatisのSQL部品に無いので、そういう時はjavaでリストの先頭レコードを取得しよう。

元記事を表示

スッキリできるJava入門 実践編第3版 Mavenの利用について(P387)

「スッキリ分かるJava入門 実践編第3版」 P387にて、Mavenの利用方法ついて記載があったが、解説通りに利用しても実行できずかなり苦戦したので、忘れない内に学んだ事を記載しておこうと思いました。

■参考書記載の利用方法
https://sukkiri.jp/technologies/devtools/maven/apache-maven-installmacos.html

解説通り、Apache:Apache Maven https://maven.apache.org
にアクセス、ZIPファイルをインストール。この時、解説は
>「ZIPファイルを適当な場所に展開。(本サイトでは、/Users/ユーザ名に展開。)」

と記載があり、自分はデスクトップにインストール。
その後、下記コマンドをターミナルにて実行。

“`
$ cat << EOF >> ~/.zshrc

export PATH=$PATH:~/apache-maven-3.8.4/bin

EOF

$ . ~/.zshrc
“`
その後、下記コマンドで確認。

“`
$ mvn -version
A

元記事を表示

KarateのテストでDBUnitを使ってDBにテストデータを入れる

## はじめに
Javaのテストフレームワークの中に[Karate](https://github.com/karatelabs/karate)というものがあります。
E2Eのテスト自動化ツールで、レポートなども生成してくれて、非常に便利なのですが、テストデータの作成が中々にめんどくさい。
Javaのコードをテスト内で実行できるので、それでORMみたいなものを作ってデータの作成もできるんですが、クラスを作ったらいちいちそっちも作ったり、修正したらメンテしたりとめんどくさいです。

そこで便利なのが、DBUnitです。
XML形式でデータを定義し、あとは流すだけでデータを作ってくれます。
また、XMLの内部で識別用の文字列をセットしておいて、後で任意の値に置換することで変数の入れ込みも行えます。

## コード

以下が該当のテストコードです。

“`bash
Feature: テスト
Background:
* def dbunit = Java.type(‘integration.util.DBUnitController’)
* def uuid = Java

元記事を表示

【LeetCode】アルゴリズム体操 1154. Day of the Year

# LeetCode – Day of the Year

#### 問題文
>Given a string date representing a Gregorian calendar date formatted as YYYY-MM-DD, return the day number of the year.

#### だいたいの日本語訳
引数:`String date`
戻り値:int型の日数

「YYYY-MM-DD」の形でString型の日付を渡すから、その年の何日目かを計算しておくれやす。

## 解答
“`java:Solution.java
class Solution {
public int dayOfYear(String date) {
int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int year = Int

元記事を表示

OTHERカテゴリの最新記事